;+ This is MSGP98.ASM ; ; Tektronix 4014 emulator for NEC-PC9801 ; Author: Hirofumi Fujii (KEK On-line group) ; ; Last edited 17-Apr-1991 ; 17-Apr-1991 Joe (and Rikitake) pointed out that tek_gtxt: should be ; 'tek_gtxt proc near'. ; 09-Mar-1991 Joe pointed out that CAN is reserved word for MASM 5. ; CAN -> CL_CAN ; SUB -> CL_SUB ; 01-Sep-1990 Start TEK4105 coding ; 09-Aug-1990 Add protection for coordinates in TEK40_DEV_COOD. ; 24-Jul-1990 for MS-Kermit v3.02 ; 10-Jul-1990 ESC[1;30m gives white line for gnuplot v2.0 ; 25-Jun-1990 Support for ESC [ XX ; YY ; .. ; ZZ m ; 30-May-1989 Fixed bug in background color. ; Reset command resets color to default (color in command mode). ; 21-Apr-1989 Cooked logging is added ; 13-Feb-1989 Fill 0FFh of all RAM of the GGDC when tek4014_save is called. GGDC_STS_PORT equ 0A0h GGDC_CMD_PORT equ 0A2h GGDC_PRM_PORT equ 0A0h GGDC_BLUE_PLANE equ 04000h GGDC_RED_PLANE equ 08000h GGDC_GREEN_PLANE equ 0C000h GGDC_GIN_PLANE equ 04000h GGDC_GCUR_PLANE equ 04000h CPU_BLUE_PLANE equ 0A800h CPU_RED_PLANE equ 0B000h CPU_GREEN_PLANE equ 0B800h TEK_X_MAX equ 4095 TEK_Y_MAX equ 3071 TEK_DX equ 56 TEK_DY equ 112 TEK41_NO_ACT equ 0 TEK41_XY_TYPE equ 1 TEK41_INT_TYPE equ 2 TEK41_STR_TYPE equ 3 TEK41_IAR_TYPE equ 4 TEK41_ARGBUF_SIZE equ 512 TEK41_FABUF_SIZE equ 1024 BELL equ 007h BS equ 008h HT equ 009h LF equ 00Ah VT equ 00Bh FF equ 00Ch CR equ 00Dh CL_CAN equ 018h CL_SUB equ 01Ah ESCAPE equ 01Bh FS equ 01Ch GS equ 01Dh RS equ 01Eh US equ 01Fh HIY equ 020h EXT equ 060h LOY equ 060h HIX equ 020h LOX equ 040h X_OFS equ 64 Y_OFS equ 8 IN_REPEAT equ 1 SIXEL_YMAX equ 378 ; 24 x 16 - 6 SIXEL_XMAX equ 639 include msxp98.h public tek4014,tek4014_ini,tek4014_reset public tek4014_save, tek4014_restore, tek4014_modlin public tek4014_color public tekstat public gdisp_on, gdisp_off, set_gcolor public sixel, sixel_in, sixel_clear public sixel_rollup, sixel_rolldown public set_gpalette data segment public 'data' extrn vt100_flags:byte, vt100_lflag:byte, vt100_gflag:byte extrn vtgrph_flg:byte extrn display_mode:byte extrn gnrm_color:byte, gbck_color:byte ; in MSYP98.ASM extrn def_color:byte, scn_color:byte gdisp_mode db 0 ; digital(0)/analogue(1) display gplane_nums db 3 ; number of graphic planes (3 or 4) gplane_actv dw 15 ; active plane mask gplane_segm dw 0A800h ; CPU segment address of G-VRAM dw 0B000h dw 0B800h dw 0E000h ; pc98_mouse_type db 1 pc98_mouse_init db 0 pc98_mouse_char db 0,'1','2','3' ; tek_dialog_area db 0 tek_dialog_vsbl db 0 ; ; Color mode ; 0: no change 0: no change 0:nochange ; 1: RGB [0-100] 1: opake 1:color ; 2: CMY [0-100] 2: sub 2:monochrome ; 3: HLS 3: add ; 4: RGB [0-255] ; tek_cmode_1 db 3 tek_cmode_2 db 1 tek_cmode_3 db 1 db 0 ; for alignment ; ; Window and Viewport (Ordering is important.) ; tek_wnx1 dw 0 tek_wnx2 dw 4095 tek_wny1 dw 0 tek_wny2 dw 3071 ; tek_vpx1 dw 0 tek_vpx2 dw 4095 tek_vpy1 dw 0 tek_vpy2 dw 3071 ; ; Transformation Matrix from Window to Viewport. ; 16-bit fixed decimal point number. ; tek_w2v_mat dw 8 dup (?) ; ; Window/Viewport for GIN (Viewport must be first) ; gin_vpx1 dw 0 gin_vpx2 dw 479 gin_vpy1 dw 0 gin_vpy2 dw 359 ; gin_wnx1 dw 0 gin_wnx2 dw 4095 gin_wny1 dw 0 gin_wny2 dw 3071 ; ; Viewport to Window transformation matrix ; gin_v2w_mat dw 8 dup (?) ; ; ; Character vectors ; tek_gtxt_ang dw 0 tek_gtxt_w dw 39 tek_gtxt_h dw 52 tek_gtxt_s dw 13 tek_gtxt_dr db 2, 0 ; graph text dir for GDC tek_gtxt_ux dw 52 tek_gtxt_uy dw 0 tek_gtxt_vx dw 0 tek_gtxt_vy dw 52 ; sixel_replace db 1, 0 sixel_state db 0 sixel_char db 0 sixel_on db 0 sixel_off db 0 sixel_x dw 0 sixel_y dw 0 repeat_count dw 0 sixel_byte dw 0 sixel_segm dw 0 ; vt_buf db 8 dup (?) vt_dialog_clr db 7,ESCAPE,"[2J",ESCAPE,"[H" ; tek_zero dw 0 ; Zero for clearing mode line tek_cur_x dw 0 ; TEK current position x tek_cur_y dw 0 ; TEK current position y tek_req_x dw 0 ; TEK requested position x tek_req_y dw 0 ; TEK requested position y ; tek_lncol dw 1 ; TEK line color tek_txcol dw 1 ; TEK text color tek_facol dw 1 ; TEK fill area color ; loc_x dw 0 ; locator position in DC loc_y dw 0 loc_mov dw 0 ; tek_npnt dw 0 ; line_type dw 0 line_type_table dw 0FFFFh dw 08888h dw 0E4E4h dw 0F0F0h dw 0FF00h dw 0927Ch dw 0FF18h dw 0CCCCh ; marker_type dw 0 ; tek41_cmd dw 0 tek41_func dw 0 tek41_nget dw 0 tek41_narg dw 0 tek41_nreq db 0 ; next requested data type tek41_nact db 0 ; next action tek41_argt db 8 dup (0) tek41_ival dw 0 ; tek_P_prv db 0,0 tek_P_num dw 0 tek_P_pnt dw 0 tek_P_buf dw 32 dup (0) ; tek_vseq db 0 tek_cur_HIY db 0 tek_cur_EXT db 0 tek_cur_LOY db 0 tek_cur_HIX db 0 tek_cur_LOX db 0 ; tek_mod db 0 ; 0=Alpha,1=Vector,2=Plot,3=Increment tek_esc db 0 ; 1=TEK in esc-seq, 2= in CSI-seq tek_byp db 0 ; 1=Bypass mode tek_cur db 0 ; 0=Alpha cursor off, 1=on tek_pen db 0 ; 0=Pen Up, 1=Pen down tek_hgt db 0 ; 0=Normal, 1=HighLight ; tek_inpanel db 0 tek_panel_bnd db 0 tek_famod db 0 tek_fapat db 0 ; tek_col0 db 0,1,2,3,4,5,6,7 ; default color index table ; ; Default Tek mode color table (R,G,B) [0-255] ; tek_col_def db 000h,000h,000h ; 0:black db 0ffh,0ffh,0ffh ; 1:white db 0ffh,000h,000h ; 2:red db 000h,0ffh,000h ; 3:green db 000h,000h,0ffh ; 4:blue db 000h,0ffh,0ffh ; 5:cyan db 0ffh,000h,0ffh ; 6:magenta db 0ffh,0ffh,000h ; 7:yellow db 0ffh,0afh,000h ; 8:orange db 0afh,0ffh,000h ; 9:yellow-green db 000h,0ffh,0afh ; 10:green-cyan db 000h,0afh,0ffh ; 11:blue-cyan db 0afh,000h,0ffh ; 12:blue-magenta db 0ffh,000h,0afh ; 13:red-magenta db 07fh,07fh,07fh ; 14:dark-gray db 0afh,0afh,0afh ; 15:light-gray ; ; Tek mode color table (R,G,B) [0-255] ; tek_col db 000h,000h,000h ; 0:black db 0ffh,0ffh,0ffh ; 1:white db 0ffh,000h,000h ; 2:red db 000h,0ffh,000h ; 3:green db 000h,000h,0ffh ; 4:blue db 000h,0ffh,0ffh ; 5:cyan db 0ffh,000h,0ffh ; 6:magenta db 0ffh,0ffh,000h ; 7:yellow db 0ffh,0afh,000h ; 8:orange db 0afh,0ffh,000h ; 9:yellow-green db 000h,0ffh,0afh ; 10:green-cyan db 000h,0afh,0ffh ; 11:blue-cyan db 0afh,000h,0ffh ; 12:blue-magenta db 0ffh,000h,0afh ; 13:red-magenta db 07fh,07fh,07fh ; 14:dark-gray db 0afh,0afh,0afh ; 15:light-gray ; ; Sixel mode color table (R,G,B) [0-255] ; Note that only plane #3 is used for sixel. ; sixel_col0 db 000h,000h,000h ; 0:black db 000h,000h,000h ; 1 db 000h,000h,000h ; 2 db 000h,000h,000h ; 3 db 0ffh,0ffh,0ffh ; 4 db 0ffh,0ffh,0ffh ; 5 db 0ffh,0ffh,0ffh ; 6 db 0ffh,0ffh,0ffh ; 7 db 000h,000h,000h ; 8 db 000h,000h,000h ; 9 db 000h,000h,000h ; 10 db 000h,000h,000h ; 11 db 0ffh,0ffh,0ffh ; 12 db 0ffh,0ffh,0ffh ; 13 db 0ffh,0ffh,0ffh ; 14 db 0ffh,0ffh,0ffh ; 15 ; sixel_col db 000h,000h,000h ; 0:black db 000h,000h,000h ; 1 db 000h,000h,000h ; 2 db 000h,000h,000h ; 3 db 0ffh,0ffh,0ffh ; 4 db 0ffh,0ffh,0ffh ; 5 db 0ffh,0ffh,0ffh ; 6 db 0ffh,0ffh,0ffh ; 7 db 000h,000h,000h ; 8 db 000h,000h,000h ; 9 db 000h,000h,000h ; 10 db 000h,000h,000h ; 11 db 0ffh,0ffh,0ffh ; 12 db 0ffh,0ffh,0ffh ; 13 db 0ffh,0ffh,0ffh ; 14 db 0ffh,0ffh,0ffh ; 15 ; tek41_col db 0,7,2,4,1,5,3,6 db 7,7,2,4,1,5,3,6 ; disp_bank db 0 actv_bank db 0 ; tek41_larg dw 0 tek41_argbuf db TEK41_ARGBUF_SIZE dup (?) dw 0 ; for guard tek41_lstr dw 0 ; string length tek41_nchr dw 0 ; number of char gotten tek41_liar dw 0 ; INT array size tek41_niar dw 0 ; number of INT gotten tek41_faadr dw 0 tek41_numbnd dw 0 tek41_nfa dw 0 tek41_lfa dw 0 tek41_fabuf db TEK41_FABUF_SIZE dup (?) ; scan_n dw 0 ; number of lines scan_x dw 0 scan_y dw 0 scan_ofs dw 0 ; offset address in the graphic plane scan_xstr dw 0 scan_xlen dw 0 scan_xmin dw 0 scan_xmax dw 0 scan_ymin dw 0 scan_ymax dw 0 ; scan_buf db 80 dup (?) scan_fil db 0, 0 ; pc98_x1 dw 0 pc98_y1 dw 0 pc98_x2 dw 0 pc98_y2 dw 0 ; HLS_n1 dw 0 HLS_n2 dw 0 ; ggdc_buff db 80 dup (?) loc_x_buff db 32 dup (?) loc_y_buff db 32 dup (?) alp_cur_buff db 48 dup (?) ; alp_cur_font db 000h,000h,000h,000h,000h,07eh,07eh,000h ; GDC_plane_address db 040h, 080h, 0C0h, 000h col_indx_tab_N db 0, 2, 4, 6, 1, 3, 5, 7 ; color index for Normal col_indx_tab_H db 7, 2, 4, 6, 1, 3, 5, 7 ; color index for HighLight ; ext_gin db 023h,000h,0FFh,000h ent_gin db 021h,000h ; complement db 078h,008h db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,000h gin_ans db 006h,020h,020h,020h,020h,020h,00Dh,004h ; ggdc_solid db 078h,008h db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,000h ggdc_on db 00Dh,000h,0FFh,000h ggdc_off db 00Ch,000h,0FFh,000h ; ggdc_set db 04Bh,001h,000h ; CSFORM db 070h,004h,000h,000h,000h,019h ; SCROLL db 023h,000h ; WRITE MODE SET db 0FFh ; terminator ; bit_on db 080h, 040h, 020h, 010h, 008h, 004h, 002h, 001h bit_off db 07Fh, 0BFh, 0DFh, 0EFh, 0F7h, 0FBh, 0FDh, 0FEh ;------------------------------------------------------------------------------ ; 8 x 8 marker font ; ; offset ; mark_dx dw -4 mark_dy dw 4 ; gmark88 db 000h,000h,000h,008h,000h,000h,000h,000h ; dot db 000h,000h,008h,01ch,008h,000h,000h,000h ; small plus db 008h,008h,008h,07fh,008h,008h,008h,000h ; large plus db 041h,022h,014h,07fh,014h,022h,041h,000h ; star db 01ch,022h,041h,041h,041h,022h,01ch,000h ; circle db 041h,022h,014h,008h,014h,022h,041h,000h ; cross db 07fh,041h,041h,041h,041h,041h,07fh,000h ; square db 008h,014h,022h,041h,022h,014h,008h,000h ; db 07fh,041h,049h,05dh,049h,041h,07fh,000h ; square-dot db 008h,014h,02ah,05dh,02ah,014h,008h,000h ; db 07fh,063h,055h,049h,055h,063h,07fh,000h ; square-cross ;------------------------------------------------------------------------------ ; text font table (8 x 8) ; gfont88 db 000h,000h,000h,000h,000h,000h,000h,000h ; space db 008h,008h,008h,008h,000h,000h,008h,000h ; ! db 022h,022h,022h,000h,000h,000h,000h,000h ; " db 024h,024h,07eh,024h,07eh,024h,024h,000h ; # db 008h,07eh,009h,03eh,048h,03fh,008h,000h ; $ db 043h,021h,010h,008h,004h,042h,061h,000h ; % db 006h,009h,009h,006h,049h,031h,04eh,000h ; & db 018h,010h,008h,000h,000h,000h,000h,000h ; ' db 010h,008h,004h,004h,004h,008h,010h,000h ; ( db 004h,008h,010h,010h,010h,008h,004h,000h ; ) db 000h,022h,014h,07fh,014h,022h,000h,000h ; * db 000h,008h,008h,07fh,008h,008h,000h,000h ; + db 000h,000h,000h,000h,00ch,008h,004h,000h ; , db 000h,000h,000h,03eh,000h,000h,000h,000h ; - db 000h,000h,000h,000h,000h,00ch,00ch,000h ; . db 040h,020h,010h,008h,004h,002h,001h,000h ; / db 03ch,062h,052h,05ah,046h,046h,03ch,000h ; 0 db 008h,00ch,008h,008h,008h,008h,01ch,000h ; 1 db 01ch,022h,020h,018h,004h,002h,03eh,000h ; 2 db 03eh,020h,010h,018h,020h,022h,01ch,000h ; 3 db 010h,018h,014h,012h,03fh,010h,010h,000h ; 4 db 03eh,002h,01eh,022h,020h,022h,01ch,000h ; 5 db 018h,004h,002h,01eh,022h,022h,01ch,000h ; 6 db 03eh,020h,010h,008h,004h,004h,004h,000h ; 7 db 03ch,042h,042h,03ch,042h,042h,03ch,000h ; 8 db 01ch,022h,022h,03ch,020h,010h,008h,000h ; 9 db 000h,00ch,00ch,000h,00ch,00ch,000h,000h ; : db 000h,00ch,00ch,000h,00ch,008h,004h,000h ; ; db 020h,010h,008h,004h,008h,010h,020h,000h ; < db 000h,000h,07eh,000h,07eh,000h,000h,000h ; = db 002h,004h,008h,010h,008h,004h,002h,000h ; > db 03ch,042h,030h,008h,008h,000h,008h,000h ; ? db 03ch,042h,071h,049h,039h,002h,03ch,000h ; @ db 01ch,022h,022h,03eh,022h,022h,022h,000h ; A db 01fh,022h,022h,01eh,022h,022h,01fh,000h ; B db 01ch,022h,002h,002h,002h,022h,01ch,000h ; C db 01fh,022h,022h,022h,022h,022h,01fh,000h ; D db 03eh,002h,002h,01eh,002h,002h,03eh,000h ; E db 03eh,002h,002h,01eh,002h,002h,002h,000h ; F db 01ch,022h,002h,002h,072h,022h,01ch,000h ; G db 022h,022h,022h,03eh,022h,022h,022h,000h ; H db 01ch,008h,008h,008h,008h,008h,01ch,000h ; I db 070h,020h,020h,020h,022h,022h,01ch,000h ; J db 042h,022h,012h,00eh,012h,022h,042h,000h ; K db 002h,002h,002h,002h,002h,002h,03eh,000h ; L db 041h,063h,055h,049h,041h,041h,041h,000h ; M db 042h,046h,04ah,052h,062h,042h,042h,000h ; N db 01ch,022h,022h,022h,022h,022h,01ch,000h ; O db 01eh,022h,022h,01eh,002h,002h,002h,000h ; P db 03ch,042h,042h,042h,052h,022h,05ch,000h ; Q db 01eh,022h,022h,01eh,012h,022h,042h,000h ; R db 01ch,022h,002h,01ch,020h,022h,01ch,000h ; S db 03eh,008h,008h,008h,008h,008h,008h,000h ; T db 022h,022h,022h,022h,022h,022h,01ch,000h ; U db 041h,041h,022h,022h,014h,014h,008h,000h ; V db 041h,041h,041h,041h,049h,055h,022h,000h ; W db 041h,022h,014h,008h,014h,022h,041h,000h ; X db 041h,022h,014h,008h,008h,008h,008h,000h ; Y db 03eh,020h,010h,008h,004h,002h,03eh,000h ; Z db 038h,008h,008h,008h,008h,008h,038h,000h ; [ db 001h,002h,004h,008h,010h,020h,040h,000h ; backslash db 00eh,008h,008h,008h,008h,008h,00eh,000h ; ] db 008h,014h,022h,000h,000h,000h,000h,000h ; ^ db 000h,000h,000h,000h,000h,000h,07fh,000h ; _ db 018h,008h,000h,000h,000h,000h,000h,000h ; left quote db 000h,000h,01ch,020h,03ch,022h,07ch,000h ; a db 002h,002h,01ah,026h,022h,022h,01eh,000h ; b db 000h,000h,01ch,022h,002h,002h,03ch,000h ; c db 020h,020h,02ch,032h,022h,022h,03ch,000h ; d db 000h,000h,01ch,022h,01eh,002h,03ch,000h ; e db 038h,044h,004h,01eh,004h,004h,004h,000h ; f db 000h,000h,01ch,022h,022h,03ch,022h,01ch ; g db 002h,002h,01ah,026h,022h,022h,022h,000h ; h db 008h,000h,008h,008h,008h,008h,010h,000h ; i db 020h,000h,020h,020h,020h,020h,022h,01ch ; j db 002h,002h,022h,012h,01ah,026h,042h,000h ; k db 008h,008h,008h,008h,008h,008h,010h,000h ; l db 000h,000h,037h,049h,049h,049h,041h,000h ; m db 000h,000h,03ah,046h,042h,042h,042h,000h ; n db 000h,000h,01ch,022h,022h,022h,01ch,000h ; o db 000h,000h,01eh,022h,022h,01eh,002h,002h ; p db 000h,000h,01ch,022h,022h,03ch,020h,060h ; q db 000h,000h,03ah,046h,002h,002h,002h,000h ; r db 000h,000h,03ch,002h,01ch,020h,01eh,000h ; s db 008h,008h,03eh,008h,008h,008h,030h,000h ; t db 000h,000h,022h,022h,022h,022h,05ch,000h ; u db 000h,000h,022h,022h,022h,014h,008h,000h ; v db 000h,000h,041h,041h,049h,049h,036h,000h ; w db 000h,000h,022h,014h,008h,014h,022h,000h ; x db 000h,000h,022h,022h,022h,03ch,022h,01ch ; y db 000h,000h,03eh,010h,008h,004h,03eh,000h ; z db 030h,008h,010h,00eh,010h,008h,030h,000h ; { db 008h,008h,008h,000h,008h,008h,008h,000h ; | db 006h,008h,004h,038h,004h,008h,006h,000h ; } db 000h,040h,03ch,002h,000h,000h,000h,000h ; ~ db 012h,049h,024h,012h,049h,024h,012h,049h ; del ;--------------------------------------------------------------------------- func41 dw 'LE' dw tek41_exec_LE db 0,0,0,0,0,0 ; dw 'LP' dw tek41_exec_LP db 2,TEK41_XY_TYPE,TEK41_INT_TYPE,0,0,0 ; dw 'LV' dw tek41_exec_LV db 1,TEK41_INT_TYPE,0,0,0,0 ; dw 'LZ' dw tek41_exec_LZ db 0,0,0,0,0,0 ; dw 'KA' dw tek41_exec_KA db 1,TEK41_INT_TYPE,0,0,0,0 ; dw 'LG' ; draw dw tek41_exec_LG db 1,TEK41_XY_TYPE,0,0,0,0 ; dw 'LF' ; move dw tek41_exec_LF db 1,TEK41_XY_TYPE,0,0,0,0 ; dw 'LH' ; marker dw tek41_exec_LH db 1,TEK41_XY_TYPE,0,0,0,0 ; dw 'LT' ; graphic text dw tek41_exec_LT db 1,TEK41_STR_TYPE,0,0,0,0 ; dw 'MC' ; set graphtext size dw tek41_exec_MC db 3,TEK41_INT_TYPE,TEK41_INT_TYPE,TEK41_INT_TYPE,0,0 ; dw 'ML' ; set line color index dw tek41_exec_ML db 1,TEK41_INT_TYPE,0,0,0,0 ; dw 'MM' ; set marker type dw tek41_exec_MM db 1,TEK41_INT_TYPE,0,0,0,0 ; dw 'MP' ; set fill pattern dw tek41_exec_MP db 1,TEK41_INT_TYPE,0,0,0,0 ; dw 'MR' ; set graphtext rotation dw tek41_exec_MR db 2,TEK41_INT_TYPE,TEK41_INT_TYPE,0,0,0 ; dw 'MT' ; set text color index dw tek41_exec_MT db 1,TEK41_INT_TYPE,0,0,0,0 ; dw 'MV' ; set line style dw tek41_exec_MV db 1,TEK41_INT_TYPE,0,0,0,0 ; dw 'NM' ; set prompt mode dw tek41_exec_none db 1,TEK41_INT_TYPE,0,0,0,0 ; dw 'RW' ; set window dw tek41_exec_RW db 2,TEK41_XY_TYPE,TEK41_XY_TYPE,0,0,0 ; dw 'TG' ; set surface color map dw tek41_exec_TG db 2,TEK41_INT_TYPE,TEK41_IAR_TYPE,0,0,0 ; dw 'TM' ; set color mode dw tek41_exec_TM db 3,TEK41_INT_TYPE,TEK41_INT_TYPE,TEK41_INT_TYPE,0,0 ; dw '%!' ; set command dw tek41_exec_SETCOM db 1,TEK41_INT_TYPE,0,0,0,0 ; dw 0 dw tek41_exec_unknown db 0,0,0,0,0,0 ;---------------------------------------------- tek_stat_msg db CR,LF," Tek status: " tek_pmode_msg db " " db " color mode: " tek_cmode_msg db "3 1 1 " db " mouse: " tek_mouse_msg db " " db CR,LF," Tek Last Unknown command: " tek_unkwn_msg dw ' ' db " Tek Last Ignored command: " tek_ignor_msg dw ' ' tek_test1_msg db ' ' tek_test2_msg db ' ' tek_test3_msg db ' ' tek_test4_msg db ' ' db '$' ;---------------------------------------------- data ends code segment public 'code' extrn vt100_modlin:near extrn outcapt:near extrn set_cur_color:near extrn set_cursor:near ; in MSZP98 extrn text_scrn:near ; in MSZP98 extrn pc98_bell:near assume cs:code,ds:data,es:nothing TEK41_W2V PROC NEAR ; ; Input (ax,bx) -- coordinate in window ; [si] -- transformation matrix ; Output (ax,bx) -- coordinate in viewport ; ; format of the transformation matrix ; xv = (xw - wx0)*mx + vx0 ; yv = (yw - wy0)*my + vy0 ; ; [si ] mx_l ; [si+ 2] mx_h ; [si+ 4] wx0 ; [si+ 6] vx0 ; [si+ 8] my_l ; [si+10] my_h ; [si+12] wy0 ; [si+14] vy0 ; push cx push dx push si push di ; mov di,bx ; save y ; sub ax,[si+ 4] push ax ; save (x-wx0) xor cx,cx cmp ax,0 jge tek41_w2v_1 mov cl,1 neg ax tek41_w2v_1: mul WORD PTR [si] ; low word mov bx,dx pop ax mul WORD PTR [si+ 2] ; high word add bx,ax jcxz tek41_w2v_2 neg bx tek41_w2v_2: add bx,[si+ 6] ; mov ax,di ; get y mov di,bx ; save result x sub ax,[si+12] push ax ; save (y-wy0) xor cx,cx cmp ax,0 jge tek41_w2v_3 mov cl,1 neg ax tek41_w2v_3: mul WORD PTR [si+ 8] ; low word mov bx,dx pop ax mul WORD PTR [si+10] ; high word add bx,ax jcxz tek41_w2v_4 neg bx tek41_w2v_4: add bx,[si+14] mov ax,di ; pop di pop si pop dx pop cx ; ret TEK41_W2V ENDP ;----------------------------------------------------------------------- ; TEK4010/4014 terminal emulator ;----------------------------------------------------------------------- TEK40_DEV_COOD PROC NEAR ; ; Transform TEK4014 coordinates to PC9801 device coordinates ; Inputs: ; AX: TEK4014 X coordinate ( to be replaced by device x ) ; BX: TEK4014 Y coordinate ( to be replaced by device y ) ; Outputs: ; AX: Device X coordinate ; BX: Device Y coordinate ; push si mov si,offset tek_w2v_mat call tek41_w2v pop si ; push cx cmp bx,399 jle tek40_dev_cood_1 mov bx,399 tek40_dev_cood_1: mov cx,399 sub cx,bx xchg bx,cx cmp ax,639 jle tek40_dev_cood_2 mov ax,639 tek40_dev_cood_2: pop cx ret ; TEK40_DEV_COOD ENDP ; ; TEK40_GIN PROC NEAR ; ; Request locator ; ; If we are using mouse, set the position ; mov pc98_mouse_type,0 test vtgrph_flg,MOUSE_BIT ; mouse on ? jz tek40_gin_00 ; no. tek40_gin_m01: mov ax,0 ; init mouse mov bx,0 int 33h cmp ax,-1 ; mouse available ? jne tek40_gin_00 cmp bx,2 ; MS-mouse ? jne tek40_gin_m02 ; ne=no. mov pc98_mouse_type,2 jmp tek40_gin_m03 tek40_gin_m02: mov pc98_mouse_type,1 tek40_gin_m03: mov cx,loc_x mov dx,loc_y mov ax,4 ; locate mouse int 33h tek40_gin_00: mov si,offset ent_gin ; write mode is complement call send_to_GGDC mov loc_mov,3 ; ; Draw X axis ; tek40_gin_01: test loc_mov,1 jz tek40_gin_02 mov di,offset loc_x_buff mov ax,gin_vpx1 mov bx,loc_y mov cx,GGDC_GIN_PLANE ; locator graphic plane call gcsrw mov ax,gin_vpx2 sub ax,gin_vpx1 mov bx,0 call gline mov byte ptr [di],0FFh mov si,offset loc_x_buff call send_to_GGDC ; ; Draw Y axis ; tek40_gin_02: test loc_mov,2 jz tek40_gin_10 mov di,offset loc_y_buff mov ax,loc_x mov bx,399 sub bx,gin_vpy2 mov cx,GGDC_GIN_PLANE call gcsrw mov ax,0 mov bx,gin_vpy2 sub bx,gin_vpy1 call gline mov byte ptr [di],0FFh mov si,offset loc_y_buff call send_to_GGDC ; tek40_gin_10: cmp pc98_mouse_type,0 ; using mouse ? jne tek40_gin_m10 ; ne=yes. jmp tek40_gin_11 tek40_gin_m10: mov ax,3 int 33h cmp pc98_mouse_type,1 ; NEC type ? jne tek40_gin_m12 ; ne=no. and ax,01h and bx,02h or bx,ax ; MS-mouse method tek40_gin_m12: and bx,03h cmp bx,0 jne tek40_gin_m14 cmp cx,loc_x jne tek40_gin_m14 cmp dx,loc_y jne tek40_gin_m14 mov ah,01h ; sense keyboard buffer int BIOS cmp bh,0 je tek40_gin_m10 mov ah,00h ; read keyboard buffer int BIOS jmp tek40_gin_ex tek40_gin_m14: mov loc_x,cx mov loc_y,dx cmp bx,0 je tek40_gin_m16 mov ax,bx mov bx,offset pc98_mouse_char add bx,ax mov al,[bx] jmp tek40_gin_ex ; tek40_gin_m16: mov si,offset loc_x_buff call send_to_GGDC mov si,offset loc_y_buff call send_to_GGDC mov loc_mov,3 jmp tek40_gin_01 ; ; If we are using mouse, read mouse. ; Otherwise, scan Keyboard ; tek40_gin_11: mov dx,1 mov ah,1 ; sense keyborad buffer int 18h ; BIOS call cmp bh,0 je tek40_gin_11 ; mov ah,2 ; sense shift keys int 18h test al,1 ; SHIFT key pressed ? jz tek40_gin_12 mov dx,4 tek40_gin_12: test al,16 ; CTRL key pressed ? jz tek40_gin_13 mov dx,8 tek40_gin_13: ; mov ah,0 ; read keyboard buffer int 18h ; mov loc_mov,0 ; cmp ax,03A00h ; UP je tek40_gin_up cmp ax,03D00h je tek40_gin_down cmp ax,03B00h je tek40_gin_left cmp ax,03C00h je tek40_gin_right ; ; Alpha-Numeric key. ; jmp tek40_gin_ex ; tek40_gin_up: sub loc_y,dx cmp loc_y,9-Y_OFS jge tek40_gin_y mov loc_y,9-Y_OFS jmp tek40_gin_y tek40_gin_down: add loc_y,dx cmp loc_y,399-Y_OFS jle tek40_gin_y mov loc_y,399-Y_OFS tek40_gin_y: ; erase X axis mov si,offset loc_x_buff or loc_mov,1 jmp tek40_gin_xy ; tek40_gin_left: sub loc_x,dx cmp loc_x,X_OFS jge tek40_gin_x mov loc_x,X_OFS jmp tek40_gin_x tek40_gin_right: add loc_x,dx cmp loc_x,511+X_OFS jle tek40_gin_x mov loc_x,511+X_OFS tek40_gin_x: mov si,offset loc_y_buff or loc_mov,2 tek40_gin_xy: call send_to_GGDC jmp tek40_gin_01 ; tek40_gin_ex: ; ; set-up answerback ; mov si,offset gin_ans mov [si+1],al ; Keyboard character ; mov si,offset gin_v2w_mat mov ax,loc_x mov bx,399 sub bx,loc_y call tek41_w2v shr ax,1 shr ax,1 ; convert to 10-bit address shr bx,1 shr bx,1 ; convert to 10-bit address ; mov si,offset gin_ans push bx ; save Y ; mov bx,ax mov cx,5 ; set shift count shr ax,cl ; get HiX and ax,01Fh ; mask higher bits or al,020h ; convert to character mov [si+2],al ; set HiX and bx,01Fh ; get LoX or bl,020h ; convert to character mov [si+3],bl ; set LoX ; pop bx ; restore Y ; mov ax,bx mov cx,5 ; set shift count shr ax,cl ; get HiY and ax,01Fh ; mask higher bits or al,020h ; convert to character mov [si+4],al ; set HiY and bx,01Fh ; get LoY or bl,020h ; convert to character mov [si+5],bl ; set LoY ; ; Erase cross hair cursor ; mov si,offset loc_x_buff call send_to_GGDC mov si,offset loc_y_buff call send_to_GGDC ; ; Reset write mode ; mov si,offset ext_gin call send_to_GGDC ; mov tek_byp,1 ; set bypass mode mov si,offset gin_ans xor cx,cx mov cl,[si] inc si ret TEK40_GIN ENDP TEK40_CURON PROC NEAR push ax push bx push cx push si push di ; mov si,offset alp_cur_font mov di,offset alp_cur_buff mov byte ptr [di],078h ; TEXTW mov byte ptr [di+1],8 ; number of parameters add di,2 cld mov cx,8 push es push ds pop es rep movsb pop es mov ax,tek_cur_x mov bx,tek_cur_y call tek40_dev_cood mov cx,GGDC_GCUR_PLANE ; cursor graphic plane call gcsrw mov byte ptr [di],21h ; write in COMPLEMENT mode mov byte ptr [di+1],0 add di,2 mov byte ptr [di],04Ch ; VEXTW mov byte ptr [di+1],3 ; number of parameters mov byte ptr [di+2],012h ; normal text dir=2 mov byte ptr [di+3],07h mov byte ptr [di+4],0 mov byte ptr [di+5],068h ; TEXTE mov byte ptr [di+6],0 mov byte ptr [di+7],0FFh ; terminator mov si,offset alp_cur_buff call send_to_GGDC mov tek_cur,1 ; pop di pop si pop cx pop bx pop ax ret TEK40_CURON ENDP TEK40_CUROFF PROC NEAR cmp tek_cur,0 je tek40_curoff_ex push si mov si,offset alp_cur_buff call send_to_GGDC pop si mov tek_cur,0 tek40_curoff_ex: ret TEK40_CUROFF ENDP TEK4014_INI PROC NEAR call tek4014_reset mov si,offset ggdc_off call send_to_GGDC ret TEK4014_INI ENDP TEK4014_COLOR PROC NEAR ; ; Set color index table ; [si] foreground color ; [si+1] background color ; push ax push di ; push si mov al,[si+1] ; background color xor ah,ah mov si,offset gnrm_color add si,ax add si,ax add si,ax mov di,offset tek_col ; index 0 is background color mov al,[si] mov [di],al mov al,[si+1] mov [di+1],al mov al,[si+2] mov [di+2],al ; push cx mov cx,4 mov di,offset sixel_col tek4014_color_sxb: mov al,[si] mov [di],al ; R mov [di+24],al ; R mov al,[si+1] mov [di+1],al ; G mov [di+25],al ; G mov al,[si+2] mov [di+2],al ; B mov [di+26],al ; B add di,3 loop tek4014_color_sxb pop cx ; pop si ; push si mov al,[si] ; foreground color xor ah,ah mov si,offset gnrm_color add si,ax add si,ax add si,ax mov di,offset tek_col add di,3 ; index 1 is foreground color mov al,[si] mov [di],al mov al,[si+1] mov [di+1],al mov al,[si+2] mov [di+2],al ; push cx mov cx,4 mov di,offset sixel_col add di,12 ; start from index 4 tek4014_color_sxf: mov al,[si] mov [di],al ; R mov [di+24],al ; R mov al,[si+1] mov [di+1],al ; G mov [di+25],al ; G mov al,[si+2] mov [di+2],al ; B mov [di+26],al ; B add di,3 loop tek4014_color_sxf pop cx ; pop si ;@@ mov [di+7],al ;@@ mov al,[si+1] ;@@ mov [di],al ;@@ mov di,offset sixel_col ;@@ mov al,[si] ;@@ mov [di+4],al ;@@ mov [di+5],al ;@@ mov [di+6],al ;@@ mov [di+7],al ;@@ mov al,[si+1] ;@@ mov [di],al ;@@ mov [di+1],al ;@@ mov [di+2],al ;@@ mov [di+3],al pop di pop ax ret TEK4014_COLOR ENDP tek40_color proc near ; ; set color ; input ax ; push ax ; save register cmp ax,0 ; normal intensity [0] ? jne tek40_color_1 ; ne=no mov tek_hgt,0 ; set normal intensity jmp tek40_color_ex tek40_color_1: cmp ax,1 ; high intensity [1] ? jne tek40_color_2 ; ne=no mov tek_hgt,1 ; set high intensity jmp tek40_color_ex tek40_color_2: cmp ax,30 ; forground color [30-37] ? jl tek40_color_bk cmp ax,37 jg tek40_color_bk sub ax,30 ; OK, convert to color index push bx mov bx,offset col_indx_tab_N add bx,ax cmp tek_hgt,0 ; HighLight ? je tek40_color_fg1 ; e=no add bx,8 tek40_color_fg1: mov al,[bx] pop bx mov tek_lncol,ax mov tek_txcol,ax mov tek_facol,ax jmp tek40_color_ex tek40_color_bk: cmp ax,40 ; background color [40-47] ? jl tek40_color_ex cmp ax,47 ; bug fixed [30-May-1989]. Was 37. jg tek40_color_ex sub ax,40 push si mov si,offset col_indx_tab_N add si,ax mov al,[si] mov si,offset scn_color mov [si+1],al call tek4014_color mov si,offset tek_col call set_gpalette pop si tek40_color_ex: pop ax ; restore ax ret tek40_color endp TEK4014_RESET PROC NEAR ; ; Hardware initialization ; tek4014_reset_lp01: in al,GGDC_STS_PORT xor al,024h test al,024h ; VSYNC & GDC Empty ? jne tek4014_reset_lp01 ; mov al,disp_bank out 0A4h,al ; set display bank mov al,actv_bank out 0A6h,al ; set active bank mov al,02h ; color mode out 068h,al ; set mode F/F mov al,08h ; 400 line mode out 068h,al ; set mode F/F mov si,offset ggdc_set ; CSFORM & SCROLL call send_to_GGDC ; cmp display_mode,0 je tek4014_reset_02 mov gdisp_mode,1 mov gplane_nums,4 jmp tek4014_reset_03 tek4014_reset_02: mov gdisp_mode,0 mov gplane_nums,3 tek4014_reset_03: mov al,gdisp_mode ; display mode out 6ah,al ; call gcls ; ; Software reset ; ; Set color mode ; mov tek_cmode_1,3 mov tek_cmode_2,1 mov tek_cmode_3,1 ; push si mov si,offset def_color call set_cur_color call tek4014_color pop si ; ; Set Windows ; mov tek_wnx1,0 mov tek_wnx2,TEK_X_MAX mov tek_wny1,0 mov tek_wny2,TEK_Y_MAX ; mov gin_wnx1,0 mov gin_wnx2,TEK_X_MAX mov gin_wny1,0 mov gin_wny2,TEK_Y_MAX ; ; Set Viewports ; mov tek_vpx1,X_OFS mov tek_vpx2,(X_OFS+479) mov tek_vpy1,Y_OFS mov tek_vpy2,(Y_OFS+359) ; mov gin_vpx1,X_OFS mov gin_vpx2,(X_OFS+479) mov gin_vpy1,Y_OFS mov gin_vpy2,(Y_OFS+359) ; ; Set Transformation Matricies ; push si push di mov si,offset tek_wnx1 mov di,offset tek_w2v_mat call set_tek41_mat mov si,offset gin_vpx1 ; viewport to window for GIN mov di,offset gin_v2w_mat call set_tek41_mat pop di pop si ; ; Set text parameters ; mov tek_gtxt_ang,0 mov tek_gtxt_w,39 mov tek_gtxt_h,52 mov tek_gtxt_s,13 mov tek_gtxt_dr,2 mov tek_gtxt_ux,52 ; w+s mov tek_gtxt_uy,0 mov tek_gtxt_vx,0 mov tek_gtxt_vy,52 ; h ; ; Set current position ; mov tek_cur_x,0 mov tek_cur_y,TEK_Y_MAX mov ax,TEK_DY sub tek_cur_y,ax mov line_type,0 mov marker_type,0 mov tek_byp,0 mov tek_lncol,1 ; line color is white mov tek_txcol,1 ; text color is white mov tek_facol,1 ; fill area color is white mov tek_hgt,0 ; Normal Intensity mov tek_esc,0 mov tek_inpanel,0 mov tek41_cmd,0 ; ; Set locator position at the center of the screen ; push bx mov ax,(TEK_X_MAX+1) shr ax,1 mov bx,(TEK_Y_MAX+1) shr bx,1 call tek40_dev_cood mov loc_x,ax mov loc_y,bx pop bx ; ; Set color index table ; push cx push di push si push es ; push ds pop es mov si,offset tek_col_def ; source mov di,offset tek_col ; destination mov cx,48 ; 16 colors x 3 cld rep movsb mov si,offset tek_col call set_gpalette ; ; Set dialog area ; mov tek_dialog_area,0 mov tek_dialog_vsbl,0 ; pop es pop si pop di pop cx ; call tek40_curon ; ret TEK4014_RESET ENDP TEK4014_SAVE PROC NEAR ; ;@@ mov si,offset tek_col0 call set_gpalette ; mov si,offset ggdc_solid call send_to_GGDC mov si,offset ggdc_off call send_to_GGDC ; ; Clear mode line ; push dx mov dx,offset tek_zero call vt100_modlin pop dx ; push ax xor ax,ax ; restore cursor attributes call set_cursor mov ax,1 call text_scrn ; text screen ON pop ax ; ret TEK4014_SAVE ENDP TEK4014_RESTORE PROC NEAR ;@@ push ax ;@@ mov ax,1 ; disable text cursor ;@@ call set_cursor ;@@ pop ax ; push ax mov al,display_mode cmp al,gdisp_mode je tek4014_restore_1 mov gdisp_mode,0 mov gplane_nums,3 cmp al,0 je tek4014_restore_2 mov gdisp_mode,1 mov gplane_nums,4 tek4014_restore_2: mov al,gdisp_mode out 6ah,al tek4014_restore_1: pop ax ; call gdisp_on ; mov si,offset tek_col call set_gpalette ret TEK4014_RESTORE ENDP TEK4014_MODLIN PROC NEAR call vt100_modlin ret TEK4014_MODLIN ENDP ; Tek4014/Tek4105 emulator by H.Fujii (KEK) ; ; Carry Set if parameters need to be passed to VT100. ; In this case, CX contains number of characters and [SI] contains the ; string. ; TEK4014 PROC NEAR cmp vt100_lflag,(LOGCOOK_BIT+LOGENAB_BIT) jne tek4014_01 ; ne = no. call outcapt ; log it tek4014_01: call tek40_curoff cmp tek_byp,0 ; bypass mode ? je tek40_00 ; e = No. mov bl,al ; Bypass mode and bl,07Fh ; Mask 8th bit cmp bl,020h ; control character ? jge tek40_ex ; ge = No. mov tek_byp,0 ; Off the bypass mode tek40_00: cmp tek_esc,0 ; in ESC sequence ? je tek40_01 ; e = No. jmp tek40_esc tek40_01: cmp tek_mod,0 ; Alpha mode ? jne tek40_02 jmp tek40_alp tek40_02: cmp tek_mod,1 ; Vector mode ? jne tek40_03 jmp tek40_vct tek40_03: cmp tek_mod,2 ; Point plot mode ? jne tek40_04 jmp tek40_vct tek40_04: cmp tek_mod,3 jne tek40_05 jmp tek40_inc tek40_05: call pc98_bell ; Program error !!! tek40_ex: cmp tek_esc,0 ; in ESC seq ? jne tek40_ex1 ; ne=yes. cmp tek_dialog_area,0 ; Disable dialog ? jne tek40_ex1 ; ne=no, dialog is VT screen cmp tek_mod,0 ; in alpha mode ? jne tek40_ex1 ; ne=no call tek40_curon tek40_ex1: mov ah,0 mov cx,0 clc ; normal return ret ;----------------------------------------------------------------------- ; ESC sequence ;----------------------------------------------------------------------- tek40_esc: cmp tek_esc,1 ; just entered ? je tek40_esc1 ; e=yes. cmp tek_esc,2 ; in CSI mode ? jne tek40_esc_n2 ; ne=no. jmp tek40_esc2 tek40_esc_n2: cmp tek_esc,3 ; in 20C ? jne tek40_esc_n3 jmp tek40_esc3 tek40_esc_n3: jmp tek40_esc4 ; tek40_esc1: cmp al,020h ; C0 character ? jb tek40_esc_C0 ; b=yes. jmp tek40_esc_GL ; tek40_esc_C0: tek40_esc_0C: cmp al,FF ; FF ? jne tek40_esc_n0C ; ne=no. test vtgrph_flg,GCLRWAIT_BIT jz tek40_esc_0C_2 push ax push bx call pc98_bell tek40_esc_0C_1: mov ax,0100h int BIOS cmp bh,0 je tek40_esc_0C_1 mov ax,0 int BIOS pop bx pop ax tek40_esc_0C_2: call gcls ; ESC FF clears screen mov tek_esc,0 ; ESC seq done mov tek_mod,0 ; enter alpha mode mov tek_cur_x,0 mov tek_cur_y,TEK_Y_MAX sub tek_cur_y,TEK_DY jmp tek40_ex tek40_esc_n0C: ; cmp al,CL_SUB ; SUB (1A) ? jne tek40_esc_n1A ; ne=no. call tek40_gin mov tek_esc,0 mov tek_mod,0 mov ah,0 clc ret ; EIXT with gin answerback tek40_esc_n1A: mov tek_esc,0 ; any other C0 characters are jmp tek40_C0 ; treated as a single C0 character ; tek40_esc_GL: cmp al,'[' je tek40_esc_5B ja tek40_esc_5C mov tek_esc,3 ; in TEK4105 command mode xor ah,ah mov tek41_cmd,ax jmp tek40_ex tek40_esc_5B: mov tek_esc,2 ; in CSI mode mov bx,offset tek_P_buf mov tek_P_pnt,bx mov word ptr [bx],0 mov tek_P_num,0 mov tek_P_prv,0 jmp tek40_ex tek40_esc_5C: jmp tek40_esc_ex ; ; ANSI CSI sequence ; tek40_esc2: cmp al,'0' jl tek40_esc2_01 cmp al,'9' jg tek40_esc2_01 xor ah,ah sub al,'0' mov bx,tek_P_pnt mov cx,[bx] shl cx,1 shl cx,1 add cx,[bx] shl cx,1 add ax,cx mov [bx],ax jmp tek40_ex tek40_esc2_01: cmp al,'?' jne tek40_esc2_02 mov tek_P_prv,al jmp tek40_ex tek40_esc2_02: cmp al,';' jne tek40_esc2_03 add tek_P_pnt,2 mov bx,tek_P_pnt mov word ptr [bx],0 inc tek_P_num jmp tek40_ex tek40_esc2_03: cmp al,'h' jne tek40_esc2_04 jmp tek40_esc_ex tek40_esc2_04: cmp al,'l' jne tek40_esc2_05 jmp tek40_vtchg tek40_esc2_05: cmp al,'m' jne tek40_esc2_06 push ax push cx push si mov si,offset tek_P_buf mov cx,tek_P_num ; number of parameters inc cx tek40_esc2_05a: mov ax,[si] ; get color code call tek40_color add si,2 loop tek40_esc2_05a ; loop over all parameters pop si pop cx pop ax jmp tek40_esc_ex tek40_esc2_06: jmp tek40_esc_ex ; tek40_esc3: ; ; 20C mode ; cmp al,020h ; C0 character ? jae tek40_esc3_01 ; ae = no. jmp tek40_C0 tek40_esc3_01: mov bx,tek41_cmd mov bh,al xchg bh,bl mov tek41_cmd,bx ; stored it. mov tek_esc,4 ; enter Tek41 command mode mov tek41_narg,0 mov tek41_nget,0 mov tek41_larg,0 ; ; analyze command and set number of arguments and argument types ; mov ax,bx mov bx,offset func41 tek41_ana_03: mov cx,[bx] cmp ax,cx je tek41_ana_01 cmp cx,0 jne tek41_ana_05 add bx,2 mov cx,[bx] mov tek41_func,cx xchg ah,al ; change to character order mov tek_unkwn_msg,ax xchg ah,al jmp tek40_ex tek41_ana_05: add bx,10 jmp tek41_ana_03 tek41_ana_01: add bx,2 mov cx,[bx] mov tek41_func,cx add bx,2 mov cl,[bx] inc bx xor ch,ch mov tek41_narg,cx cmp cx,0 je tek41_ana_02 push si mov si,offset tek41_argt tek41_ana_04: mov al,[bx] mov [si],al inc bx inc si loop tek41_ana_04 pop si tek41_ana_02: jmp tek41_next ; tek40_esc4: cmp al,20h ; C0 character ? jae tek40_esc4_02 ; ae=no. cmp al,ESCAPE ; one of ESC,FS,GS,RS,US ? jl tek40_esc4_01 ; l=no. mov tek_esc,0 ; terminate the command jmp tek40_C0 ; and treat as C0 tek40_esc4_01: jmp tek40_ex ; ignore any other C0 character. tek40_esc4_02: cmp tek41_nreq,TEK41_XY_TYPE jne tek40_esc4_03 jmp tek41_xy tek40_esc4_03: cmp tek41_nreq,TEK41_INT_TYPE jne tek40_esc4_04 jmp tek41_int tek40_esc4_04: cmp tek41_nreq,TEK41_STR_TYPE jne tek40_esc4_05 jmp tek41_str tek40_esc4_05: cmp tek41_nreq,TEK41_IAR_TYPE jne tek40_esc4_06 jmp tek41_int tek40_esc4_06: jmp tek40_ex ; Unknown command, ignore. ; tek40_esc_ex: mov tek_esc,0 jmp tek40_ex ; receive and convert Tek41 type xy-coordinate ; note that xy-coordinate system is the same as Tek401x. ; tek41_xy: jmp tek40_vct ; goto Tek40 type vector format analyzer tek41_xy1: mov cx,tek41_larg ; check the room for storage add cx,4 cmp cx,TEK41_ARGBUF_SIZE jae tek41_xy2 ; ae = room is full mov bx,offset tek41_argbuf add bx,tek41_larg mov ax,tek_req_x mov [bx],ax ; store it in buffer mov ax,tek_req_y mov [bx+2],ax add tek41_larg,4 ; update buffer length tek41_xy2: inc tek41_nget ; icrement number of argument we get jmp tek41_next ; ; receive and convert Tek41 type integer ; 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 ; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ ; |P|1| value | ... |P|0|1|S| value | where S=1 if int >= 0 ; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ ; tek41_int: mov ah,al ; copy to AH mov bx,tek41_ival ; get previous value test al,040h ; Hi byte ? jz tek41_int1 ; z=no mov cx,6 ; shift count shl bx,cl ; shift-left previous value by 6 bits and ah,03Fh or bl,ah mov tek41_ival,bx ; store it jmp tek40_ex ; and continue tek41_int1: mov cx,4 shl bx,cl and ah,00Fh or bl,ah test al,010h ; check sign bit jnz tek41_int2 ; nz=positive neg bx ; negative integer tek41_int2: mov ax,bx mov tek41_ival,ax ; store it mov cx,tek41_larg ; check the room for storage add cx,2 cmp cx,TEK41_ARGBUF_SIZE jae tek41_int3 ; ae = room is full mov bx,offset tek41_argbuf add bx,tek41_larg mov [bx],ax ; store it in buffer add tek41_larg,2 ; update buffer length tek41_int3: cmp tek41_nact,TEK41_INT_TYPE ; processing single INT ? jne tek41_int4 ; ne=no. inc tek41_nget ; increment number of arg. we get jmp tek41_next ; setup for next argument tek41_int4: cmp tek41_nact,TEK41_STR_TYPE ; processing string ? jne tek41_int5 ; ne=no. mov tek41_lstr,ax ; set character length mov tek41_nchr,0 ; clear the filled size mov tek41_nreq,TEK41_STR_TYPE ; next data is character jmp tek40_ex ; and continue tek41_int5: cmp tek41_nact,TEK41_IAR_TYPE ; processing INT array ? jne tek41_int8 cmp tek41_nreq,TEK41_INT_TYPE ; beginning of array ? jne tek41_int6 mov tek41_liar,ax ; set array length mov tek41_niar,0 ; clear the filled size mov tek41_ival,0 ; clear the buffer mov tek41_nreq,TEK41_IAR_TYPE ; next data is INT array elem. jmp tek40_ex ; and continue tek41_int6: inc tek41_niar mov cx,tek41_niar cmp cx,tek41_liar jge tek41_int7 mov tek41_ival,0 ; clear the buffer jmp tek40_ex tek41_int7: inc tek41_nget jmp tek41_next tek41_int8: jmp tek40_ex ; PROGRAM ERROR !!! ; tek41_str: mov cx,tek41_larg ; check the room inc cx cmp cx,TEK41_ARGBUF_SIZE jae tek41_str1 ; ae = room is full mov bx,offset tek41_argbuf add bx,tek41_larg mov [bx],al inc tek41_larg ; update buffer length tek41_str1: inc tek41_nchr mov cx,tek41_nchr cmp cx,tek41_lstr jge tek41_str2 jmp tek40_ex tek41_str2: inc tek41_nget jmp tek41_next ; ; setup next argument for Tek41xx ; tek41_next: mov cx,tek41_nget ; number of arg. we have cmp cx,tek41_narg ; enough ? jl tek41_next1 ; l=no, not. mov tek41_nreq,TEK41_NO_ACT ; yes, we have enough, no more. jmp tek41_exec ; execute the command. tek41_next1: mov bx,offset tek41_argt add bx,cx mov al,[bx] ; argument type mov tek41_nact,al ; set next action cmp al,TEK41_XY_TYPE jne tek41_next2 mov tek41_nreq,TEK41_XY_TYPE ; next data type is XY-type mov tek_vseq,0 ; initialize vector format seq. jmp tek40_ex tek41_next2: cmp al,TEK41_INT_TYPE jne tek41_next3 mov tek41_nreq,TEK41_INT_TYPE ; next data type is INT mov tek41_ival,0 jmp tek40_ex tek41_next3: cmp al,TEK41_STR_TYPE jne tek41_next4 mov tek41_nreq,TEK41_INT_TYPE ; next data type is INT mov tek41_ival,0 mov tek41_lstr,0 mov tek41_nchr,0 jmp tek40_ex tek41_next4: cmp al,TEK41_IAR_TYPE jne tek41_next5 mov tek41_nreq,TEK41_INT_TYPE ; next data type is INT mov tek41_ival,0 mov tek41_liar,0 mov tek41_niar,0 jmp tek40_ex tek41_next5: jmp tek40_ex ; PROGRAM ERROR !!! ; ; execute the Tek41 command ; tek41_exec: mov bx,tek41_func jmp bx ; tek41_exec_MC: mov bx,offset tek41_argbuf mov ax,[bx] ; text width mov tek_gtxt_w,ax mov ax,[bx+2] ; text height mov tek_gtxt_h,ax mov ax,[bx+4] ; text spacing mov tek_gtxt_s,ax call set_gtxt_vect jmp tek41_exec_done ; tek41_exec_ML: mov ax,tek41_ival ;@@ call tek41_getcol ; convert to tek41 color index mov tek_lncol,ax jmp tek41_exec_done ; tek41_exec_MT: mov ax,tek41_ival ;@@ call tek41_getcol ; convert to tek41 color index mov tek_txcol,ax jmp tek41_exec_done ; tek41_exec_MM: mov ax,tek41_ival mov marker_type,ax jmp tek41_exec_done ; tek41_exec_MP: mov ax,tek41_ival cmp ax,0 jg tek41_exec_MP2 je tek41_exec_MP1 neg ax ;@@ call tek41_getcol ; convert to tek41 color index tek41_exec_MP1: mov tek_facol,ax mov tek_famod,0 tek41_exec_MP2: jmp tek41_exec_done ; tek41_exec_MV: mov ax,tek41_ival and ax,07h mov line_type,ax jmp tek41_exec_done ; tek41_exec_MR: mov bx,offset tek41_argbuf mov ax,[bx] ; rotation angle mov cx,[bx+2] cmp cx,0 je tek41_exec_MR_1 jg tek41_exec_MR_2 neg cx sar ax,cl jmp tek41_exec_MR_1 tek41_exec_MR_2: sal ax,cl tek41_exec_MR_1: cmp ax,0 jge tek41_exec_MR_3 add ax,360 jmp tek41_exec_MR_1 tek41_exec_MR_3: cmp ax,360 jl tek41_exec_MR_4 sub ax,360 jmp tek41_exec_MR_3 tek41_exec_MR_4: mov tek_gtxt_ang,ax call set_gtxt_vect jmp tek41_exec_done ; tek41_exec_KA: mov ax,tek41_ival mov tek_dialog_area,al jmp tek41_exec_done ; tek41_exec_LV: mov ax,tek41_ival mov tek_dialog_vsbl,al call text_scrn jmp tek41_exec_done ; tek41_exec_LZ: mov si,offset vt_dialog_clr xor cx,cx xor ax,ax mov cl,[si] inc si stc ret ; tek41_exec_SETCOM: cmp tek41_ival,0 je tek41_exec_nSETCOM mov ah,1 ; change the mode to VT mov al,0 xor cx,cx mov tek41_cmd,0 mov tek_esc,0 ret tek41_exec_nSETCOM: tek41_exec_unknown: mov tek41_cmd,0 ; unknown command jmp tek40_ex ; tek41_exec_none: mov ax,tek41_cmd xchg ah,al mov tek_ignor_msg,ax jmp tek41_exec_done ; tek41_exec_LG: cmp tek_inpanel,0 je tek41_exec_LG1 jmp tek40_vct_fa tek41_exec_LG1: mov ax,line_type call tek_ltyp mov ax,tek_cur_x mov bx,tek_cur_y call tek40_dev_cood mov pc98_x1,ax mov pc98_y1,bx mov ax,tek_req_x mov bx,tek_req_y call tek40_dev_cood call tek_draw jmp tek41_exec_LF1 tek41_exec_LH: cmp tek_inpanel,0 je tek41_exec_LH1 jmp tek40_vct_fa tek41_exec_LH1: mov ax,tek_req_x mov bx,tek_req_y call tek40_dev_cood call tek_mark jmp tek41_exec_LF1 tek41_exec_LF: cmp tek_inpanel,0 je tek41_exec_LF1 jmp tek40_vct_fa tek41_exec_LF1: mov ax,tek_req_x mov tek_cur_x,ax mov ax,tek_req_y mov tek_cur_y,ax jmp tek41_exec_done ; tek41_exec_LT: cmp tek_inpanel,0 je tek41_exec_LT1 jmp tek40_ex tek41_exec_LT1: mov cx,tek41_nchr ; get number of characters mov si,offset tek41_argbuf add si,2 ; 1st 2-bytes contains num of char call tek_gtxt ; draw graphic text jmp tek41_exec_done ; ; Begin Panel Boundary ; tek41_exec_LP: mov si,offset tek41_fabuf cmp tek_inpanel,0 ; already in panel mode ? jne tek41_exec_LP_c1 ; ne=Yes. Close the previous polygon jmp tek41_exec_LP_1 tek41_exec_LP_c1: mov ax,tek41_lfa add si,ax mov bx,tek41_faadr ; get the address of the 1st point mov ax,[bx+2] ; get 1st X mov [si],ax ; add it to the last point mov ax,[bx+4] ; get 1st Y mov [si+2],ax ; add it to the last point add tek41_lfa,4 ; update buffer length ; cmp tek_panel_bnd,0 ; draw boundary ? je tek41_exec_LP_c2 ; e=no. mov ax,[si] ; get the 1st X mov bx,[si+2] ; get the 1st Y xchg ax,pc98_x2 xchg bx,pc98_y2 mov pc98_x1,ax mov pc98_y1,bx mov ax,pc98_x2 mov bx,pc98_y2 push si ; save buffer address call tek_draw pop si tek41_exec_LP_c2: add si,4 ; update buffer address jmp tek41_exec_LP_2 tek41_exec_LP_1: mov scan_xmin,639 mov scan_xmax,0 mov scan_ymin,399 mov scan_ymax,0 mov tek41_lfa,0 tek41_exec_LP_2: mov tek41_faadr,si mov ax,1 ; 1st point mov [si],ax mov ax,tek_req_x mov bx,tek_req_y mov tek_cur_x,ax mov tek_cur_y,bx call tek40_dev_cood mov [si+2],ax mov [si+4],bx mov pc98_x2,ax mov pc98_y2,bx cmp ax,scan_xmin jge tek41_exec_LP_3 mov scan_xmin,ax tek41_exec_LP_3: cmp ax,scan_xmax jle tek41_exec_LP_4 mov scan_xmax,ax tek41_exec_LP_4: cmp bx,scan_ymin jge tek41_exec_LP_5 mov scan_ymin,bx tek41_exec_LP_5: cmp bx,scan_ymax jle tek41_exec_LP_6 mov scan_ymax,bx tek41_exec_LP_6: add tek41_lfa,6 mov tek_inpanel,1 mov ax,tek41_ival mov tek_panel_bnd,al ; set panel boundary mode test al,1 jz tek41_exec_LP_ex mov ax,line_type call tek_ltyp tek41_exec_LP_ex: jmp tek41_exec_done ; tek41_exec_LE: mov tek_inpanel,0 ; mov si,offset tek41_fabuf mov ax,tek41_lfa add si,ax mov bx,tek41_faadr mov ax,[bx+2] ; get 1st X mov [si],ax ; add it to the last point mov ax,[bx+4] ; get 1st Y mov [si+2],ax ; add it to the last point xor ax,ax ; terminator mov [si+4],ax ; set terminator add tek41_lfa,6 ; update buffer length ; cmp tek_panel_bnd,0 je tek41_exec_LE6 mov ax,[si] mov bx,[si+2] xchg ax,pc98_x2 xchg bx,pc98_y2 mov pc98_x1,ax mov pc98_y1,bx mov ax,pc98_x2 mov bx,pc98_y2 call tek_draw ; tek41_exec_LE6: mov si,offset tek41_fabuf call tek_fill tek41_exec_LE_ex: jmp tek41_exec_done ; tek41_exec_RW: push ax push bx ; ; Check the variables ; mov si,offset tek41_argbuf mov ax,[si] ; x1 mov bx,[si+4] ; x2 cmp ax,bx jl tek41_exec_RW1 jmp tek41_exec_RW_ERR tek41_exec_RW1: mov ax,[si+2] ; y1 mov bx,[si+6] ; y2 cmp ax,bx jl tek41_exec_RW2 jmp tek41_exec_RW_ERR tek41_exec_RW2: ; ; Check OK. Do it. ; mov ax,[si] mov tek_wnx1,ax mov ax,[si+2] mov tek_wny1,ax mov ax,[si+4] mov tek_wnx2,ax mov ax,[si+6] mov tek_wny2,ax ; push si push di mov si,offset tek_wnx1 mov di,offset tek_w2v_mat call set_tek41_mat ; set the transformation matrix pop di pop si jmp tek41_exec_RW_ex ; tek41_exec_RW_ERR: tek41_exec_RW_ex: pop bx pop ax jmp tek41_exec_done ; tek41_exec_TM: push bx mov bx,offset tek41_argbuf mov ax,[bx] cmp ax,0 je tek41_exec_TM1 mov tek_cmode_1,al tek41_exec_TM1: add bx,2 mov ax,[bx] cmp ax,0 je tek41_exec_TM2 mov tek_cmode_2,al tek41_exec_TM2: add bx,2 mov ax,[bx] cmp ax,0 je tek41_exec_TM3 mov tek_cmode_3,al tek41_exec_TM3: pop bx jmp tek41_exec_done ; tek41_exec_TG: push si mov si,offset tek41_argbuf mov ax,[si] ; ignore surface number tek41_exec_TG1: mov ax,[si+2] ; array size cmp ax,4 ; must be multiple of 4 jge tek41_exec_TG2 jmp tek41_exec_TG_ex tek41_exec_TG2: shr ax,1 shr ax,1 ; number of colors mov cx,ax add si,4 tek41_exec_TG_L1: cmp cx,0 jg tek41_exec_TG_L2 jmp tek41_exec_TG_do tek41_exec_TG_L2: mov ax,[si] ; get index cmp ax,0 jge tek41_exec_TG3 jmp tek41_exec_TG_nx tek41_exec_TG3: cmp ax,15 jle tek41_exec_TG4 jmp tek41_exec_TG_nx tek41_exec_TG4: cmp tek_cmode_1,1 ; RGB [0-100] mode ? jne tek41_exec_TG5 jmp tek41_exec_TG_RGB1 tek41_exec_TG5: cmp tek_cmode_1,2 ; CMY [0-100] mode ? jne tek41_exec_TG6 jmp tek41_exec_TG_CMY tek41_exec_TG6: cmp tek_cmode_1,3 ; HLS mode ? jne tek41_exec_TG7 jmp tek41_exec_TG_HLS tek41_exec_TG7: cmp tek_cmode_1,4 ; RGB [0-255] mode ? jne tek41_exec_TG8 jmp tek41_exec_TG_RGB2 tek41_exec_TG8: jmp tek41_exec_TG_ex ; other cases are not supported yet. tek41_exec_TG_HLS: push si add si,2 call HLS_to_RGB pop si jmp tek41_exec_TG_RGB1 tek41_exec_TG_CMY: push bx mov ax,100 mov bx,[si+2] sub ax,bx mov [si+2],ax mov ax,100 mov bx,[si+4] sub ax,bx mov [si+4],ax mov ax,100 mov bx,[si+6] sub ax,bx mov [si+6],ax pop bx tek41_exec_TG_RGB1: push bx push dx mov bx,655 mov ax,[si+2] ; get R mul bx mov al,ah xor ah,ah mov [si+2],ax mov ax,[si+4] ; G mul bx mov al,ah xor ah,ah mov [si+4],ax mov ax,[si+6] ; B mul bx mov al,ah xor ah,ah mov [si+6],ax pop dx pop bx tek41_exec_TG_RGB2: push bx mov bx,offset tek_col mov ax,[si] ; get index add bx,ax add bx,ax add bx,ax mov ax,[si+2] mov [bx],al mov ax,[si+4] mov [bx+1],al mov ax,[si+6] mov [bx+2],al pop bx tek41_exec_TG_nx: dec cx add si,8 ; 4 integers are processed. jmp tek41_exec_TG_L1 tek41_exec_TG_do: mov si,offset tek_col call set_gpalette tek41_exec_TG_ex: pop si ; tek41_exec_done: mov tek41_cmd,0 mov tek_esc,0 jmp tek40_ex ; tek40_vtchg: cmp tek_P_prv,'?' jne tek40_vtchg_ex cmp tek_P_buf,38 jne tek40_vtchg_ex mov ah,1 mov al,0 mov cx,0 clc ret tek40_vtchg_ex: jmp tek40_esc_ex ; Alpha mode: If printable character, then put the character at ; current position. ;--------- tek40_alp: ;--------- and al,07Fh cmp al,' ' ; C0 character ? jae tek40_alp_01 ; ae=no. jmp tek40_C0 tek40_alp_01: cmp tek_dialog_area,0 ; dialog on graphic screen ? je tek40_alp_02 ; e = yes. mov si,offset vt_buf mov [si],al mov cx,1 stc ; set carry to pass the char. to VT ret tek40_alp_02: sub al,' ' xor ah,ah shl ax,1 shl ax,1 shl ax,1 mov si,offset gfont88 add si,ax mov di,offset ggdc_buff mov byte ptr [di],078h ; TEXTW mov byte ptr [di+1],8 ; number of parameters add di,2 cld mov cx,8 push es push ds pop es rep movsb pop es ; add di,8 mov ax,tek_cur_x mov bx,tek_cur_y call tek40_dev_cood push di ;@@ mov cx,GGDC_GREEN_PLANE ; cursor graphic plane xor cx,cx call gcsrw mov byte ptr [di],20h mov byte ptr [di+1],0 add di,2 mov byte ptr [di],04Ch ; VEXTW mov byte ptr [di+1],3 ; number of parameters mov byte ptr [di+2],012h ; normal text dir=2 mov byte ptr [di+3],07h mov byte ptr [di+4],0 mov byte ptr [di+5],068h ; TEXTE mov byte ptr [di+6],0 mov byte ptr [di+7],0FFh ; terminator mov si,offset ggdc_buff ;@@ call send_to_GGDC mov ax,tek_txcol ; set text color pop di call GGDC_color mov ax,TEK_DX add tek_cur_x,ax jmp tek40_ex ;-------- tek40_C0: ;-------- cmp al,ESCAPE ; need to handle in this module? jl tek40_C01 ; l=no. May go to vt jmp tek40_C02 tek40_C01: cmp tek_dialog_area,0 ; dialog on graphics ? je tek40_C01_1 ; e=yes. mov tek_esc,0 mov tek_mod,0 mov si,offset vt_buf mov [si],al mov cx,1 stc ; set carry to pass AL to VT ret tek40_C01_1: mov tek_esc,0 mov tek_mod,0 cmp al,BELL jne tek40_n07 call pc98_bell jmp tek40_ex tek40_n07: cmp al,BS jne tek40_n08 sub tek_cur_x,TEK_DX cmp tek_cur_x,0 jge tek40_08_01 mov tek_cur_x,0 tek40_08_01: mov tek_esc,0 jmp tek40_ex tek40_n08: ; cmp al,HT jne tek40_n09 add tek_cur_x,TEK_DX cmp tek_cur_x,TEK_X_MAX jle tek40_09_01 mov tek_cur_x,TEK_X_MAX tek40_09_01: mov tek_esc,0 jmp tek40_ex tek40_n09: ; cmp al,LF jne tek40_n0A sub tek_cur_y,TEK_DY cmp tek_cur_y,0 jge tek40_0A_01 mov tek_cur_y,TEK_Y_MAX sub tek_cur_y,TEK_DY tek40_0A_01: mov tek_esc,0 ; ESC seq done jmp tek40_ex tek40_n0A: ; cmp al,VT jne tek40_n0B jmp tek40_ex tek40_n0B: cmp al,CR jne tek40_n0D mov tek_cur_x,0 mov tek_mod,0 ; enter alpha mode mov tek_esc,0 ; ESC seq done jmp tek40_ex tek40_n0D: ; cmp al,CL_CAN jne tek40_n18 mov tek_mod,0 mov tek_esc,0 ; ; Leave tektronix mode if tek4010 enabled ; test vt100_flags,AUTOTEK_BIT jz tek40_18_01 mov ah,1 ; pass no character mov al,0 mov cx,0 clc ret tek40_18_01: jmp tek40_ex tek40_n18: ; ; ESC, FS, GS, RS, US must be analyzed in TeK module ; tek40_C02: cmp al,ESCAPE jne tek40_n1B mov tek_esc,1 ; initiate ESC sequence jmp tek40_ex tek40_n1B: ; cmp al,FS jne tek40_n1C mov tek_mod,2 ; enter point plot mode mov tek_vseq,0 ; reset xy order sequence mov di,offset ggdc_buff mov byte ptr [di],078h ; TEXTW command mov byte ptr [di+1],2 ; number of parameters mov word ptr [di+2],0FFFFh ; set line type to solid mov byte ptr [di+4],0FFh ; terminator mov si,offset ggdc_buff call send_to_GGDC mov tek_esc,0 ; ESC seq done jmp tek40_ex tek40_n1C: ; cmp al,GS jne tek40_n1D mov tek_mod,1 ; enter graph mode mov tek_npnt,0 ; reset number of points mov tek_vseq,0 mov ax,line_type call tek_ltyp mov tek_esc,0 ; ESC seq done jmp tek40_ex tek40_n1D: ; cmp al,RS jne tek40_n1E mov tek_mod,3 ; enter incremental plot mode mov tek_pen,0 ; reset pen state mov di,offset ggdc_buff mov byte ptr [di],078h ; TEXTW command mov byte ptr [di+1],2 ; number of parameters mov word ptr [di+2],0FFFFh ; set line type to solid mov byte ptr [di+4],0FFh ; terminator mov si,offset ggdc_buff call send_to_GGDC mov tek_esc,0 ; ESC seq done jmp tek40_ex tek40_n1E: ; cmp al,US jne tek40_n1F mov tek_mod,0 ; enter alpha mode mov line_type,0 mov tek_esc,0 ; ESC seq done jmp tek40_ex tek40_n1F: mov tek_esc,0 ; Unknonw C0 character jmp tek40_ex ;--------- tek40_vct: ;--------- and al,07Fh ; Mask 8th bit cmp al,' ' ; Control character ? jae tek40_vct_01 ; ae = No. cmp al,ESCAPE jae tek40_vct_C0 cmp al,CR jne tek40_vct_n0D cmp tek_dialog_area,0 ; disable dialog ? je tek40_vct_C0 ; e=yes. tek40_vct_n0D: jmp tek40_ex ; any other C0 characters are ignored. tek40_vct_C0: jmp tek40_C0 ; Yes. control character. tek40_vct_01: mov ah,al and ah,060h and al,01Fh ; cmp tek_vseq,0 jne tek40_vct_02 tek40_vct_HIY: cmp ah,HIY ; HIY data ? jne tek40_vct_EXT mov tek_cur_HIY,al ; Yes. Fill HIY mov tek_vseq,1 ; Next is EXT jmp tek40_vct_end tek40_vct_02: cmp tek_vseq,1 ; EXT order? jne tek40_vct_03 tek40_vct_EXT: cmp ah,EXT ; EXT data ? jne tek40_vct_LOY mov tek_cur_LOY,al ; Yes. Temporary store to LOY mov tek_vseq,2 ; Next is LOY jmp tek40_vct_end tek40_vct_03: cmp tek_vseq,2 ; LOY order ? jne tek40_vct_04 tek40_vct_LOY: cmp ah,LOY ; LOY data ? jne tek40_vct_HIX mov ah,tek_cur_LOY ; Yes. LOY/EXT appears twice. mov tek_cur_EXT,ah ; Previous is EXT and current is LOY mov tek_cur_LOY,al mov tek_vseq,3 ; Next is HIX jmp tek40_vct_end tek40_vct_04: cmp tek_vseq,3 ; HIX order ? jne tek40_vct_05 tek40_vct_HIX: cmp ah,HIX ; HIX data ? jne tek40_vct_LOX ; No. Test LOX data mov tek_cur_HIX,al ; Yes. Set HIX mov tek_vseq,4 ; Next is LOX jmp tek40_vct_end tek40_vct_05: cmp tek_vseq,4 ; LOX order ? jne tek40_vct_ERR tek40_vct_LOX: cmp ah,LOX ; LOX data ? jne tek40_vct_ERR ; No. This is error mov tek_cur_LOX,al ; Yes. Set LOX mov tek_vseq,0 ; GS seq done jmp tek40_get_xy tek40_vct_ERR: call pc98_bell mov tek_vseq,0 mov tek_npnt,0 cmp tek_esc,4 ; in Tek41 command ? jne tek40_vct_ERR1 ; ne = no. mov tek_req_x,0 mov tek_req_y,0 jmp tek41_xy1 tek40_vct_ERR1: jmp tek40_vct_end ; ; Convert TEK xy representation to the binary (x,y) ; tek40_get_xy: mov al,tek_cur_HIY ; get HIY xor ah,ah ; clear higher byte mov cl,5 ; number of shifts shl ax,cl ; HIY done or al,tek_cur_LOY ; add LOY shl ax,1 shl ax,1 mov bl,tek_cur_EXT ; get EXT shr bl,1 shr bl,1 and bl,3 ; Lower 2 bits have meaning or al,bl ; all done. mov tek_req_y,ax ; set requested y ; mov al,tek_cur_HIX ; get HIX xor ah,ah ; clear higher byte mov cl,5 ; number of shifts shl ax,cl ; HIX is set or al,tek_cur_LOX ; add LOX shl ax,1 shl ax,1 mov bl,tek_cur_EXT ; get EXT and bl,3 ; Only lower 2 bits have meaning or al,bl ; all done. mov tek_req_x,ax ; set requested x ; cmp tek_esc,4 ; in TeK41 command ? jne tek40_get_xy1 ; ne = no. jmp tek41_xy1 tek40_get_xy1: cmp tek_inpanel,0 ; in Panel mode ? je tek40_get_xy2 ; e = no. jmp tek40_vct_fa tek40_get_xy2: ; cmp tek_mod,1 je tek40_vec_ln jmp tek40_vct_pt tek40_vec_ln: cmp tek_npnt,0 jne tek40_vct_ln01 mov tek_npnt,1 jmp tek40_vct_do1 ; tek40_vct_ln01: ; ; Not the first point. Draw line. ; mov ax,tek_cur_x mov bx,tek_cur_y call tek40_dev_cood mov pc98_x1,ax mov pc98_y1,bx mov ax,tek_req_x mov bx,tek_req_y call tek40_dev_cood mov pc98_x2,ax mov pc98_y2,bx call tek_draw jmp tek40_vct_do1 ; ; Point plot mode ; tek40_vct_pt: mov ax,tek_req_x mov bx,tek_req_y call tek40_dev_cood call tek_mark ; tek40_vct_do: mov di,si ;@@ call send_to_GGDC call GGDC_color tek40_vct_do1: mov ax,tek_req_x mov tek_cur_x,ax mov ax,tek_req_y mov tek_cur_y,ax jmp tek40_vct_end ; tek40_vct_fa: mov ax,tek_req_x mov bx,tek_req_y call tek40_dev_cood mov cx,tek41_lfa add cx,10 ; requested length cmp cx,TEK41_FABUF_SIZE ; have enough room ? jbe tek40_vct_fa1 ; be=yes jmp tek40_vct_fa2 tek40_vct_fa1: push si mov si,offset tek41_fabuf add si,tek41_lfa mov [si],ax mov [si+2],bx add tek41_lfa,4 mov si,tek41_faadr mov cx,[si] inc cx mov [si],cx ; increment number of points pop si cmp ax,scan_xmin jge tek40_vct_fa1_1 mov scan_xmin,ax tek40_vct_fa1_1: cmp ax,scan_xmax jle tek40_vct_fa1_2 mov scan_xmax,ax tek40_vct_fa1_2: cmp bx,scan_ymin jge tek40_vct_fa1_3 mov scan_ymin,bx tek40_vct_fa1_3: cmp bx,scan_ymax jle tek40_vct_fa1_4 mov scan_ymax,bx tek40_vct_fa1_4: tek40_vct_fa2: cmp tek_panel_bnd,0 je tek40_vct_end xchg ax,pc98_x2 xchg bx,pc98_y2 mov pc98_x1,ax mov pc98_y1,bx mov ax,pc98_x2 mov bx,pc98_y2 call tek_draw tek40_vct_end: jmp tek40_ex ; ; Incremental Plot ; tek40_inc: and al,07Fh ; mask 8th bit cmp al,'A' ; move to right? jne tek40_inc_NA ; ne = no inc tek_cur_x jmp tek40_inc_do tek40_inc_NA: cmp al,'B' ; move to left? jne tek40_inc_NB ; ne = no. dec tek_cur_x jmp tek40_inc_do tek40_inc_NB: cmp al,'D' ; move to up? jne tek40_inc_ND ; ne = no. inc tek_cur_y jmp tek40_inc_do tek40_inc_ND: cmp al,'H' ; move to down? jne tek40_inc_NH ; ne = no. dec tek_cur_y jmp tek40_inc_do tek40_inc_NH: cmp al,'E' ; move to right up jne tek40_inc_NE inc tek_cur_x inc tek_cur_y jmp tek40_inc_do tek40_inc_NE: cmp al,'J' jne tek40_inc_NJ dec tek_cur_x dec tek_cur_y jmp tek40_inc_do tek40_inc_NJ: cmp al,'F' jne tek40_inc_NF dec tek_cur_x inc tek_cur_y jmp tek40_inc_do tek40_inc_NF: cmp al,'I' jne tek40_inc_NI inc tek_cur_x dec tek_cur_y jmp tek40_inc_do tek40_inc_NI: cmp al,' ' jne tek40_inc_NS mov tek_pen,0 jmp tek40_ex tek40_inc_NS: cmp al,'P' jne tek40_inc_NP mov tek_pen,1 jmp tek40_ex tek40_inc_NP: mov tek_mod,0 ; Enter alpha mode jmp tek40_00 tek40_inc_do: cmp tek_pen,0 jne tek40_inc_do1 jmp tek40_ex tek40_inc_do1: mov di,offset ggdc_buff mov ax,tek_cur_x mov bx,tek_cur_y call tek40_dev_cood ;@@ mov cx,GGDC_GREEN_PLANE xor cx,cx call gcsrw mov byte ptr [di],20h mov byte ptr [di+1],0 add di,2 ; mov byte ptr [di],4ch ; VECTW command mov byte ptr [di+1],9 ; number of parameters ; mov byte ptr [di+2],0 ; dir mov word ptr [di+3],0 ; abs(d_x) mov word ptr [di+5],0 ; 2*abs(d_y)-abs(d_x) mov word ptr [di+7],0 ; 2*abs(d_y)-2*abs(d_x) mov word ptr [di+9],0 ; 2*abs(d_y) ; mov byte ptr [di+11],6ch ; VECTE command mov byte ptr [di+12],0 ; with no parameters add di,13 ; update address ; mov byte ptr [di],0FFh ; set terminator mov si,offset ggdc_buff mov ax,tek_lncol ; set line color ; mov di,si ;@@ call send_to_GGDC call GGDC_color jmp tek40_ex ; TEK4014 ENDP ; tek_ltyp proc near ; ; Set line type in AX ; shl ax,1 mov si,offset line_type_table add si,ax mov ax,[si] mov di,offset ggdc_buff mov byte ptr [di],078h ; TEXTW command mov byte ptr [di+1],2 ; number of parameters mov word ptr [di+2],ax ; line type mov byte ptr [di+4],0FFh ; terminator mov si,offset ggdc_buff call send_to_GGDC ret tek_ltyp endp ; tek_draw proc near ; ; Draw line between from (pc98_x1,pc98_y1) to (ax,bx) ; push ax push bx mov di,offset ggdc_buff mov ax,pc98_x1 mov bx,pc98_y1 xor cx,cx call gcsrw mov byte ptr [di],20h mov byte ptr [di+1],0 add di,2 pop bx pop ax sub ax,pc98_x1 sub bx,pc98_y1 call gline mov byte ptr [di],0FFh mov si,offset ggdc_buff mov ax,tek_lncol mov di,si call GGDC_color ret tek_draw endp ; tek_mark proc near ; ; Put marker at (ax,bx) given in device coordinate ; cmp marker_type,0 ; marker type 0 ? je tek_mark_0 ; e=yes jmp tek_mark_n0 tek_mark_0: xor cx,cx call gcsrw mov byte ptr [di],20h mov byte ptr [di+1],0 add di,2 ; mov byte ptr [di],4ch ; VECTW command mov byte ptr [di+1],9 ; number of parameters ; mov byte ptr [di+2],0 ; dir mov word ptr [di+3],0 ; abs(d_x) mov word ptr [di+5],0 ; 2*abs(d_y)-abs(d_x) mov word ptr [di+7],0 ; 2*abs(d_y)-2*abs(d_x) mov word ptr [di+9],0 ; 2*abs(d_y) ; mov byte ptr [di+11],6ch ; VECTE command mov byte ptr [di+12],0 ; with no parameters add di,13 ; update address ; mov byte ptr [di],0FFh ; set terminator mov si,offset ggdc_buff mov ax,tek_lncol ; set line color mov di,si jmp tek_mark_do tek_mark_n0: push ax push bx mov ax,marker_type xor ah,ah shl ax,1 shl ax,1 shl ax,1 mov si,offset gmark88 add si,ax mov di,offset ggdc_buff mov byte ptr [di],078h ; TEXTW mov byte ptr [di+1],8 ; number of parameters add di,2 cld mov cx,8 push es push ds pop es rep movsb pop es ;@@ add di,8 mov byte ptr [di],0ffh ; set terminator mov si,offset ggdc_buff call send_to_GGDC pop bx pop ax ; remember x position add ax,mark_dx add bx,mark_dy mov di,offset ggdc_buff xor cx,cx call gcsrw mov byte ptr [di],20h mov byte ptr [di+1],0 add di,2 mov byte ptr [di],04Ch ; VECTW mov byte ptr [di+1],3 ; number of parameters mov byte ptr [di+2],012h ; normal text dir=2 mov byte ptr [di+3],07h mov byte ptr [di+4],0 mov byte ptr [di+5],068h ; TEXTE mov byte ptr [di+6],0 mov byte ptr [di+7],0FFh ; terminator mov di,offset ggdc_buff mov si,di mov ax,tek_lncol ; set marker color tek_mark_do: call GGDC_color ret tek_mark endp ; tek_gtxt proc near ; ; Write Graphic Text ; cx number of characters ; [si] strings ; tek_gtxt1: cmp cx,0 jg tek_gtxt2 jmp tek_gtxt_ex tek_gtxt2: push cx push si ; mov al,[si] and al,07Fh cmp al,' ' jae tek_gtxt3 mov al,' ' tek_gtxt3: sub al,' ' xor ah,ah shl ax,1 shl ax,1 shl ax,1 mov si,offset gfont88 add si,ax mov di,offset ggdc_buff mov byte ptr [di],078h ; TEXTW mov byte ptr [di+1],8 ; number of parameters add di,2 cld mov cx,8 push es push ds pop es rep movsb pop es ; add di,8 mov byte ptr [di],0FFh ; set terminator mov si,offset ggdc_buff call send_to_GGDC ; mov ax,tek_cur_x mov bx,tek_cur_y call tek40_dev_cood mov di,offset ggdc_buff ;@@ mov cx,GGDC_GREEN_PLANE ; cursor graphic plane xor cx,cx call gcsrw mov byte ptr [di],20h mov byte ptr [di+1],0 add di,2 mov byte ptr [di],04Ch ; VEXTW mov byte ptr [di+1],3 ; number of parameters mov al,010h ; normal text or al,tek_gtxt_dr ; set text dir mov byte ptr [di+2],al mov byte ptr [di+3],07h mov byte ptr [di+4],0 mov byte ptr [di+5],068h ; TEXTE mov byte ptr [di+6],0 mov byte ptr [di+7],0FFh ; terminator mov si,offset ggdc_buff mov di,si ;@@ call send_to_GGDC mov ax,tek_lncol ; set text color call GGDC_color mov ax,tek_gtxt_ux add tek_cur_x,ax mov ax,tek_gtxt_uy add tek_cur_y,ax ; pop si pop cx inc si dec cx jmp tek_gtxt1 tek_gtxt_ex: ret tek_gtxt endp ; ; Routines for Fill Area ; scan_clr proc near ; ; Purpose: Clear the scan buffer, scan_buf. ; Input: none ; Output: none ; push ax push cx push di push es ; cld mov cx,40 ; size of the scan buffer in words mov di,offset scan_buf push ds pop es ; es = ds xor ax,ax ; data rep stosw ; string clear ; pop es pop di pop cx pop ax ret scan_clr endp ; scan_cross proc near ; ; Purpose: calculate the cross point of the line and scan_y ; Input: san_y, [si], scan_xmin, scan_xmax, bit_on ; Output: scan_buf ; WorkArea: pc98_x1, pc98_y1, pc98_x2, pc98_y2 ; push ax push bx push dx ; mov ax,[si+2] ; y1 mov bx,[si+6] ; y2 cmp bx,ax ; y2 > y1 ? jg scan_cross_1 ; g=yes mov pc98_y1,bx mov pc98_y2,ax mov ax,[si+4] mov bx,[si] jmp scan_cross_2 scan_cross_1: mov pc98_y1,ax mov pc98_y2,bx mov ax,[si] mov bx,[si+4] scan_cross_2: mov pc98_x1,ax mov pc98_x2,bx mov ax,scan_y cmp ax,pc98_y1 ; scan_y >= y1 jge scan_cross_3 ; ge=yes jmp scan_cross_ex scan_cross_3: cmp ax,pc98_y2 ; scan_y < y2 jl scan_cross_4 ; l=yes jmp scan_cross_ex scan_cross_4: sub ax,pc98_y1 ; ax = scan_y - y1 mov bx,pc98_x2 sub bx,pc98_x1 ; bx = x2 - x1 imul bx ; dx:ax =(scan_y - y1)*(x2-x1) mov bx,pc98_y2 sub bx,pc98_y1 ; bx = y2 - y1 idiv bx ; dx:ax =(scan_y-y1)*(x2-x1)/(y2-y1) add ax,pc98_x1 cmp ax,scan_xmin ; scan_x < xmin ? jge scan_cross_5 ; ge = no mov ax,scan_xmin scan_cross_5: cmp ax,scan_xmax ; scan_x > xmax ? jle scan_cross_6 ; le = no mov ax,scan_xmax scan_cross_6: push ax and ax,07h mov bx,offset bit_on add bx,ax mov dl,[bx] pop ax mov bx,offset scan_buf shr ax,1 shr ax,1 shr ax,1 add bx,ax xor [bx],dl scan_cross_ex: pop dx pop bx pop ax ret scan_cross endp ; scan_fill proc near ; ; fill the scan line ; push ax push bx push cx push dx push si ; mov si,offset scan_buf add si,scan_xstr mov dx,0ff00h ; dh:fill, dl:no-fill mov cx,scan_xlen scan_fill_1: mov al,[si] cmp al,0 jne scan_fill_2 mov [si],dl jmp scan_fill_5 scan_fill_2: push cx mov cx,8 mov bx,offset bit_on scan_fill_3: mov ah,[bx] and ah,al cmp ah,0 je scan_fill_4 xchg dh,dl scan_fill_4: mov ah,[bx] and ah,dl or [si],ah inc bx loop scan_fill_3 pop cx scan_fill_5: inc si loop scan_fill_1 pop si pop dx pop cx pop bx pop ax ret scan_fill endp ; scan_put proc near ; ; Put the scan line to the graphic screen ; push es cld mov dx,1 xor ch,ch mov cl,gplane_nums mov bx,offset gplane_segm scan_put1: push bx push cx mov ax,[bx] mov es,ax mov di,scan_ofs mov si,offset scan_buf add si,scan_xstr mov cx,scan_xlen test tek_facol,dx jz scan_put3 scan_put2: lodsb or es:[di],al inc di loop scan_put2 jmp scan_put4 scan_put3: lodsb xor al,0ffh and es:[di],al inc di loop scan_put3 scan_put4: pop cx pop bx add bx,2 shl dx,1 loop scan_put1 scan_put_ex: pop es ret scan_put endp ; tek_fill proc near ; ; Fill area ; mov ax,scan_ymin mov scan_y,ax shl ax,1 shl ax,1 add ax,scan_y ; ax=scan_y*5 mov cx,4 shl ax,cl ; ax=scan_y*80 mov scan_ofs,ax mov ax,scan_xmin mov cx,3 shr ax,cl mov scan_xstr,ax ; start byte address in x add scan_ofs,ax mov ax,scan_xmax mov cx,3 shr ax,cl sub ax,scan_xstr inc ax mov scan_xlen,ax ; cmp gdisp_mode,0 je tek_fill_1 jmp tek_fill_GC1 tek_fill_1: mov ax,scan_y cmp ax,scan_ymax jle tek_fill_2 jmp tek_fill_ex tek_fill_2: call scan_clr ; clear the scan buffer mov si,offset tek41_fabuf ; position of the line ; tek_fill_3: mov cx,[si] ; get number of points jcxz tek_fill_5 add si,2 tek_fill_4: call scan_cross add si,4 loop tek_fill_4 add si,4 jmp tek_fill_3 tek_fill_5: call scan_fill call scan_put inc scan_y add scan_ofs,80 jmp tek_fill_1 ; tek_fill_GC1: cld mov al,0C0h ; GRCG on, RMW mode, all planes are active out 7Ch,al mov cx,4 mov dx,1 tek_fill_GC2: test tek_facol,dx jz tek_fill_GC3 mov al,0FFh jmp tek_fill_GC4 tek_fill_GC3: mov al,0 tek_fill_GC4: out 7Eh,al ; write tile reg. shl dx,1 loop tek_fill_GC2 ; push es tek_fill_GC5: mov ax,scan_y cmp ax,scan_ymax jg tek_fill_GC7 call scan_clr ; clear the scan buffer mov si,offset tek41_fabuf ; position of the line tek_fill_GC8: mov cx,[si] ; number of lines jcxz tek_fill_GC9 add si,2 tek_fill_GC6: call scan_cross add si,4 loop tek_fill_GC6 add si,4 jmp tek_fill_GC8 tek_fill_GC9: call scan_fill mov di,scan_ofs mov ax,gplane_segm mov es,ax mov si,offset scan_buf add si,scan_xstr mov cx,scan_xlen rep movsb inc scan_y add scan_ofs,80 jmp tek_fill_GC5 tek_fill_GC7: mov al,040h ; GRCG off out 7Ch,al pop es ; tek_fill_ex: ret tek_fill endp ; tek41_getcol proc near ; ; convert tek41 color index to normal index ; push bx and ax,0fh mov bx,offset tek41_col add bx,ax mov ax,[bx] pop bx ret tek41_getcol endp ; set_gcolor proc near ; ; set graphic color ; push ax push si mov al,vt100_gflag and al,07Fh ; mask text screen ctrl bit cmp al,0 jne set_gcolor_n0 mov si,offset gnrm_color jmp set_gcolor_do set_gcolor_n0: cmp al,1 jne set_gcolor_n1 mov si,offset gbck_color jmp set_gcolor_do set_gcolor_n1: cmp al,2 jne set_gcolor_n2 mov si,offset sixel_col jmp set_gcolor_do set_gcolor_n2: cmp al,3 jne set_gcolor_n3 mov si,offset sixel_col jmp set_gcolor_do set_gcolor_n3: cmp al,4 jne set_gcolor_n4 mov si,offset tek_col jmp set_gcolor_do set_gcolor_n4: cmp al,5 jne set_gcolor_n5 mov si,offset tek_col jmp set_gcolor_do set_gcolor_n5: jmp set_gcolor_ex set_gcolor_do: call set_gpalette call gdisp_on mov al,1 test vt100_gflag,80h jz set_gcolor_do1 mov al,tek_dialog_vsbl set_gcolor_do1: call text_scrn set_gcolor_ex: pop si pop ax ret set_gcolor endp ; sixel_clear proc near call gcls ret sixel_clear endp sixel_in proc near call gcls mov si,offset sixel_col call set_gpalette call gdisp_on mov sixel_x,0 mov sixel_y,0 mov sixel_state,0 mov repeat_count,0 ret sixel_in endp ; sixel proc near cmp sixel_state,IN_REPEAT jne sixel_1 cmp al,'0' jb sixel_1 cmp al,'9' ja sixel_1 xor ah,ah sub al,'0' push ax mov ax,repeat_count add repeat_count,ax mov cx,3 shl ax,cl add repeat_count,ax ; repeat_count *= 10 pop ax add repeat_count,ax jmp sixel_ex sixel_1: cmp al,07Eh ja sixel_2 cmp al,03Fh jb sixel_2 ; b=no. special char. mov sixel_state,0 xor ah,ah sub al,03Fh call sixel_put mov sixel_state,0 ; clear the sixel state mov repeat_count,0 ; clear the repeat counter jmp sixel_ex sixel_2: cmp al,'!' ; repeat count prefix ? jne sixel_3 ; ne = no. mov sixel_state,IN_REPEAT ; yes, set repeat count flag mov repeat_count,0 ; and clear the counter jmp sixel_ex sixel_3: cmp al,'$' ; Graphic CR ? jne sixel_4 ; ne = no. mov sixel_x,0 ; yes, go to left margin mov sixel_state,0 ; clear the sixel state mov repeat_count,0 ; and clear the counter jmp sixel_ex sixel_4: cmp al,'-' ; Graphic NL ? jne sixel_5 ; ne = no. mov sixel_x,0 ; yes, go to left margin xor cx,cx ; and move Y by repeat count sixel_4_1: add sixel_y,6 inc cx cmp cx,repeat_count jl sixel_4_1 mov sixel_state,0 mov repeat_count,0 jmp sixel_ex sixel_5: cmp al,020h ; character ? jb sixel_ex ; b=no. it's control char. cmp al,07Fh ; DEL/C1/GR ? jae sixel_ex ; e=yes. ignore it. mov sixel_state,0 mov repeat_count,0 sixel_ex: ret sixel endp ; ; put sixel character in AL to the graphic screen ; sixel_put proc near push si push es mov sixel_char,al ; save the sixel character cmp sixel_y,SIXEL_YMAX jle sixel_put_1 mov ax,sixel_y sub ax,SIXEL_YMAX mov cx,ax call sixel_scroll mov sixel_y,SIXEL_YMAX sixel_put_1: cmp sixel_x,SIXEL_XMAX jle sixel_put_2 jmp sixel_put_6 sixel_put_2: mov sixel_segm,CPU_GREEN_PLANE mov ax,sixel_y add sixel_segm,ax shl ax,1 shl ax,1 add sixel_segm,ax ; sixel_segm = sixel_y*5 + segm_0 mov ax,sixel_x shr ax,1 shr ax,1 shr ax,1 mov sixel_byte,ax ; sixel_byte = sixel_x / 8 mov ax,sixel_x and ax,07h ; ax = sixel_x % 8 cmp ax,0 ; byte boundary ? jne sixel_put_2_1 ; ne = no, not. cmp repeat_count,8 ; repeat_count >= 8 ? jl sixel_put_2_1 ; l = no, not. jmp sixel_put_byte1 sixel_put_2_1: mov bx,offset bit_on add bx,ax mov cl,[bx] mov sixel_on,cl ; bit mask to ON the graphic bit mov bx,offset bit_off add bx,ax mov cl,[bx] mov sixel_off,cl ; bit mask to OFF the graphic bit mov ax,sixel_segm mov es,ax mov cx,6 ; repeat count cld mov si,sixel_byte mov al,sixel_char mov dl,1 sixel_put_3: test al,dl jz sixel_put_4 mov bh,sixel_on or es:[si],bh jmp sixel_put_5 sixel_put_4: cmp sixel_replace,1 ; replace mode? jne sixel_put_5 ; ne=no. mov bh,sixel_off and es:[si],bh sixel_put_5: shl dl,1 add si,80 loop sixel_put_3 sixel_put_6: add sixel_x,1 dec repeat_count jmp sixel_put_7 ; sixel_put_byte1: mov ax,sixel_segm mov es,ax mov cx,6 ; repeat count cld mov si,sixel_byte mov al,sixel_char mov dl,1 sixel_put_byte3: test al,dl jz sixel_put_byte4 mov bh,0ffh mov es:[si],bh jmp sixel_put_byte5 sixel_put_byte4: cmp sixel_replace,1 ; replace mode? jne sixel_put_byte5 ; ne=no. mov bh,0 mov es:[si],bh sixel_put_byte5: shl dl,1 add si,80 loop sixel_put_byte3 sixel_put_byte6: add sixel_x,8 sub repeat_count,8 ; sixel_put_7: cmp repeat_count,0 jle sixel_put_8 jmp sixel_put_1 sixel_put_8: mov repeat_count,0 pop es pop si ret sixel_put endp ; sixel_scroll proc near ; ; scroll up CX lines ; push bx push si push di push es push ds ; cld ; mov si,0 ; offset of the top of the buffer mov di,0 ; for both dest. and source. mov ax,cx add ax,cx shl ax,1 add ax,cx ; ax = n * 5, number of para. mov bx,ax ; save it for later use mov ax,(CPU_BLUE_PLANE+1) ; top of the buffer mov es,ax ; dest. segm. add ax,bx mov ds,ax ; source segm. mov cx,32760 ; number of words of the buffer rep movsw ; move words mov si,0 ; clear offsets mov di,0 ; for both dest. and source mov ax,CPU_GREEN_PLANE mov ds,ax ; source segm. sub ax,bx mov es,ax ; dest. segm. mov cx,16000 ; scroll with status line mov ax,bx ; ax = n * 5 shl ax,1 shl ax,1 shl ax,1 ; ax = n * 40 sub cx,ax rep movsw ; pop ds pop es pop di pop si pop bx ret sixel_scroll endp sixel_rollup proc near push bx push si push di push es push ds ; mov ax,cx shl ax,1 shl ax,1 add ax,cx ; ax = n * 5 mov bx,ax ; bx = ax = n * 5 shl ax,1 shl ax,1 shl ax,1 ; ax = n * 40 ; ; copy top n-lines to the save buffer ; cld mov si,0 mov di,0 push ax mov ax,(CPU_BLUE_PLANE+1) ; top segment mov ds,ax mov ax,(CPU_GREEN_PLANE+2000) ; save-buffer segment mov es,ax pop ax ; ax = n * 40 mov cx,ax rep movsw ; ; roll-up n-lines ; mov si,0 mov di,0 push ax mov ax,(CPU_BLUE_PLANE+1) mov es,ax ; destination add ax,bx mov ds,ax ; source mov cx,32760 rep movsw ; mov si,0 mov di,0 mov ax,CPU_GREEN_PLANE mov es,ax add ax,bx mov ds,ax mov cx,15360 pop ax sub cx,ax rep movsw ; ; Copy saved n-lines to the bottom ; mov si,0 mov di,0 push ax mov ax,(CPU_GREEN_PLANE+1920) sub ax,bx mov es,ax ; destination mov ax,(CPU_GREEN_PLANE+2000) mov ds,ax ; source pop ax mov cx,ax rep movsw ; pop ds pop es pop di pop si pop bx ret sixel_rollup endp sixel_rolldown proc near push bx push si push di push es push ds ; mov ax,cx shl ax,1 shl ax,1 add ax,cx ; ax = n * 5 mov bx,ax ; bx = n * 5, save it for later use shl ax,1 shl ax,1 shl ax,1 ; ax = n * 40 ; ; Copy bottom n-lines to the save buffer ; cld mov si,0 mov di,0 push ax mov ax,(CPU_GREEN_PLANE+1920) ; 1920 = (24x16)lines x 5 segm. sub ax,bx mov ds,ax ; source segm. mov ax,(CPU_GREEN_PLANE+2000) ; save segm. mov es,ax ; destination pop ax ; ax = n * 40 mov cx,ax rep movsw ; store n-lines to save segm. ; ; Rolldown n-lines ; std mov si,30718 ; bottom offset address (word boundary) mov di,30718 push ax mov ax,CPU_GREEN_PLANE mov es,ax ; destination sub ax,bx mov ds,ax ; source mov cx,15360 ; cx = 24 x 16 x 40 words rep movsw ; reverse move in Green segm. ; mov si,0FFEEh ; bottom offset address (word boundary) mov di,0FFEEh mov ax,(CPU_BLUE_PLANE+1) mov es,ax sub ax,bx mov ds,ax mov cx,32760 ; number of words in the buffer pop ax ; ax = n * 40 sub cx,ax rep movsw ; cld mov si,0 mov di,0 push ax mov ax,(CPU_GREEN_PLANE+2000) mov ds,ax mov ax,(CPU_BLUE_PLANE+1) mov es,ax pop ax ; ax = n * 40 mov cx,ax rep movsw ; pop ds pop es pop di pop si pop bx ret sixel_rolldown endp ;------------------------------------------------------------------------------ tekstat proc near push ax mov si,offset tek_cmode_msg mov al,tek_cmode_1 add al,'0' mov [si],al mov al,tek_cmode_2 add al,'0' mov [si+2],al mov al,tek_cmode_3 add al,'0' mov [si+4],al ; mov si,offset tek_mouse_msg test vtgrph_flg,MOUSE_BIT jz tekstat_m01 mov al,'o' mov [si],al mov al,'n' mov [si+1],al mov al,' ' mov [si+2],al jmp tekstat_m02 tekstat_m01: mov al,'o' mov [si],al mov al,'f' mov [si+1],al mov [si+2],al tekstat_m02: mov al,' ' mov [si+3],al mov al,pc98_mouse_type add al,'0' mov [si+4],al ; mov si,offset tek_pmode_msg mov al,tek_mod add al,'0' mov [si],al mov al,tek_esc add al,'0' mov [si+1],al mov si,offset tek_stat_msg pop ax ret tekstat endp ;---------------------------------------------------------------------------- set_tek41_mat proc near ; ; set the transformation matrix. ; parameter consistency must be checked before call. ; Input [si] window xmin,xmax,ymin,ymax; viewport xmin,xmax,ymin,ymax ; Output [di] transformation matrix ; push ax push bx push dx ; mov ax,[si+10] ; viewport xmax sub ax,[si+ 8] ; viewport (xmax-xmin) inc ax xor dx,dx mov bx,[si+ 2] ; window xmax sub bx,[si ] ; window (xmax-xmin) inc bx div bx mov [di+ 2],ax xor ax,ax div bx mov [di ],ax ; mov ax,[si+14] ; viewport ymax sub ax,[si+12] ; viewport (ymax-ymin) inc ax xor dx,dx mov bx,[si+ 6] ; window ymax sub bx,[si+ 4] ; window (ymax-ymin) inc bx div bx mov [di+10],ax xor ax,ax div bx mov [di+ 8],ax ; mov ax,[si ] ; get window xmin mov [di+ 4],ax mov ax,[si+ 4] ; get window ymin mov [di+12],ax mov ax,[si+ 8] ; get viewport xmin mov [di+ 6],ax mov ax,[si+12] ; get viewport ymin mov [di+14],ax ; pop dx pop bx pop ax ret set_tek41_mat endp ;------------------------------------------------------------------------------ send_to_GGDC proc near ; ; send commands and parameters ; to graphic GDC ; inputs DS:[SI] address of the list ; push ax push cx push si cld send_to_GGDC_loop1: lodsb cmp al,0ffh je send_to_GGDC_exit push ax send_to_GGDC_loop2: in al,GGDC_STS_PORT test al,2 jne send_to_GGDC_loop2 pop ax out GGDC_CMD_PORT,al lodsb mov cl,al mov ch,0 cmp cx,0 je send_to_GGDC_loop1 send_to_GGDC_loop3: lodsb push ax send_to_GGDC_loop4: in al,GGDC_STS_PORT test al,2 jne send_to_GGDC_loop4 pop ax out GGDC_PRM_PORT,al loop send_to_GGDC_loop3 jmp send_to_GGDC_loop1 send_to_GGDC_exit: pop si pop cx pop ax ret send_to_GGDC endp ;------------------------------------------------------------------------------ GGDC_color proc near ; ; send DS:[SI] to graphic GDC with ; color index. ; ; inputs ; ax: color index ; si: buffer address (used by send_to_GGDC) ; di: CSR pointer ; push bx push cx push dx push di ; mov bx,[di+3] push bx mov bx,[di+5] push bx ; xor ch,ch mov cl,gplane_nums mov bx,offset GDC_plane_address mov dx,1 GGDC_color_1: and byte ptr [di+3],3Fh ; mask plane address push ax mov al,[bx] or byte ptr [di+3],al ; add plane address pop ax inc bx test dx,gplane_actv jz GGDC_color_4 ; skip if non-active plane test dx,ax ; test color bit jz GGDC_color_2 mov byte ptr [di+5],23h ; write mode = SET jmp GGDC_color_3 GGDC_color_2: mov byte ptr [di+5],22h ; write mode = CLEAR GGDC_color_3: call send_to_GGDC GGDC_color_4: shl dx,1 loop GGDC_color_1 ; pop bx mov [di+5],bx pop bx mov [di+3],bx ; pop di pop dx pop cx pop bx ret GGDC_color endp ;----------------------------------------------------------------------- ; Get digitized color index in AL from (r,g,b) ; si: (r,g,b) table ; get_dig_color proc near push cx mov ch,ah ; save AH mov ah,[si] ; get red mov cl,6 shr ah,cl and ah,02h mov al,ah mov ah,[si+1] ; get green mov cl,5 shr ah,cl and ah,04h or al,ah mov ah,[si+2] ; get blue mov cl,7 shr ah,cl and ah,01h or al,ah mov ah,ch ; restore AH pop cx ret get_dig_color endp HLS_value proc near ; ; input HLS_n1 n1 [0-100] ; HLS_n2 n2 [0-100] ; AX : hue ; output AX : value ; push bx push dx ; HLS_value_1: cmp ax,360 jle HLS_value_2 sub ax,360 jmp HLS_value_1 HLS_value_2: cmp ax,0 jge HLS_value_3 add ax,360 jmp HLS_value_2 HLS_value_3: cmp ax,60 jl HLS_value_4 cmp ax,180 jl HLS_value_5 cmp ax,240 jl HLS_value_6 mov ax,HLS_n1 jmp HLS_value_ex HLS_value_5: mov ax,HLS_n2 jmp HLS_value_ex HLS_value_6: mov bx,ax mov ax,240 sub ax,bx HLS_value_4: mov bx,ax mov ax,HLS_n2 sub ax,HLS_n1 imul bx mov bx,60 idiv bx add ax,HLS_n1 HLS_value_ex: pop dx pop bx ret HLS_value endp HLS_to_RGB proc near ; ; input [si] Hue [0-360] ; [si+2] Lightness [0-100] ; [si+4] Satulation [0-100] ; push ax push bx push dx ; mov ax,[si+4] ; get s cmp ax,0 ; if( s==0 ) then monochrome jne HLS_to_RGB_1 ; ne=no jmp HLS_to_RGB_nomo HLS_to_RGB_1: mov bx,[si+2] ; get l mul bx ; dx:ax=l*s (dx should be 0) mov bx,100 div bx ; ax=(l*s)/100 cmp WORD PTR [si+2],50 ; if( l>50 ) then case_2 jg HLS_to_RGB_2 mov bx,[si+2] ; bx=l jmp HLS_to_RGB_3 HLS_to_RGB_2: mov bx,[si+4] ; bx=s sub bx,ax ; bx=s-l*s/100 mov ax,[si+2] ; ax=l HLS_to_RGB_3: add ax,bx ; ax=ax+bx mov HLS_n2,ax mov bx,[si+2] ; bx=l shl bx,1 ; bx=2*l sub bx,ax ; bx=2*l-ax mov HLS_n1,bx mov ax,[si] ; ax=hue push ax call HLS_value mov [si],ax pop ax push ax mov bx,120 sub ax,bx ; ax=hue-120 call HLS_value mov [si+2],ax pop ax mov bx,120 add ax,bx ; ax=hue+120 call HLS_value mov [si+4],ax jmp HLS_to_RGB_ex HLS_to_RGB_nomo: mov ax,[si+2] mov [si],ax mov [si+4],ax HLS_to_RGB_ex: pop dx pop bx pop ax ret HLS_to_RGB endp ;----------------------------------------------------------------------- ; Set graphic color palette ; si: points the color index table (8 colors) ; set_gpalette proc near push ax push bx push cx ; cmp gdisp_mode,0 ; digital display ? jne set_gpalette_A ; ne=no. jmp set_gpalette_D ;-------------- set_gpalette_A: ;-------------- push si mov cx,16 mov bx,0 set_gpalette_A1: push cx mov al,bl out 0A8h,al ; set color index lodsb mov cx,4 shr al,cl and al,0Fh out 0ACh,al ; set red lodsb mov cx,4 shr al,cl and al,0Fh out 0AAh,al ; set green lodsb mov cx,4 shr al,cl and al,0Fh out 0AEh,al ; set blue pop cx inc bx loop set_gpalette_A1 ; pop si jmp set_gpalette_ex ; ;-------------- set_gpalette_D: ;-------------- push si add si,9 ; index #3 call get_dig_color mov ah,al mov cl,4 shl ah,cl pop si push si add si,21 ; index #7 call get_dig_color or al,ah out 0A8h,al ; set palette #3 and #7 pop si ; push si add si,3 ; index #1 call get_dig_color mov ah,al mov cl,4 shl ah,cl pop si push si add si,15 ; index #5 call get_dig_color or al,ah out 0AAh,al ; set palette #1 and #5 pop si ; push si add si,6 ; index #2 call get_dig_color mov ah,al mov cl,4 shl ah,cl pop si push si add si,18 ; index #6 call get_dig_color or al,ah out 0ACh,al ; set palette #2 and #6 pop si ; push si call get_dig_color mov ah,al mov cl,4 shl ah,cl pop si push si add si,12 call get_dig_color or al,ah out 0AEh,al ; set palette #0 and #4 pop si ; set_gpalette_ex: pop cx pop bx pop ax ret set_gpalette endp set_gtxt_vect proc near push ax push bx push cx mov bx,tek_gtxt_w add bx,tek_gtxt_s mov cx,tek_gtxt_h mov ax,tek_gtxt_ang cmp ax,45 jge set_gtxt_vect_n1 jmp set_gtxt_vect_1 set_gtxt_vect_n1: cmp ax,135 jge set_gtxt_vect_n2 jmp set_gtxt_vect_2 set_gtxt_vect_n2: cmp ax,225 jge set_gtxt_vect_n3 jmp set_gtxt_vect_3 set_gtxt_vect_n3: cmp ax,315 jge set_gtxt_vect_1 jmp set_gtxt_vect_4 set_gtxt_vect_1: mov tek_gtxt_dr,2 mov tek_gtxt_ux,bx mov tek_gtxt_uy,0 mov tek_gtxt_vx,0 mov tek_gtxt_vy,cx jmp set_gtxt_vect_5 set_gtxt_vect_2: neg cx mov tek_gtxt_dr,4 mov tek_gtxt_ux,0 mov tek_gtxt_uy,bx mov tek_gtxt_vx,cx mov tek_gtxt_vy,0 jmp set_gtxt_vect_5 set_gtxt_vect_3: neg bx neg cx mov tek_gtxt_dr,6 mov tek_gtxt_ux,bx mov tek_gtxt_uy,0 mov tek_gtxt_vx,0 mov tek_gtxt_vy,cx jmp set_gtxt_vect_5 set_gtxt_vect_4: neg bx mov tek_gtxt_dr,0 mov tek_gtxt_ux,0 mov tek_gtxt_uy,bx mov tek_gtxt_vx,cx mov tek_gtxt_vy,0 set_gtxt_vect_5: pop cx pop bx pop ax ret set_gtxt_vect endp ;------------------------------------------------------------------------------ gcsrw proc near ; ; fill CSRW parameters in the buffer [di] ; Inputs ; ax: x position ; bx: y position ; cx: plane offset / 256 ; di: buffer address ( to be broken ) ; Outputs ; di: next buffer address ; push ax push bx push cx mov byte ptr [di],49h ; fill CSRW command mov byte ptr [di+1],3 ; number of parameters push ax ; save x value push cx ; save plane number mov cl,4 ; shift counts shr ax,cl ; ax = x / 16 mov cx,bx ; save y value shl bx,1 ; bx = y * 2 shl bx,1 ; bx = bx * 2 = y * 4 add bx,cx ; bx = bx + y = y * 5 mov cl,3 ; shift counts shl bx,cl ; bx = bx * 8 = y * 40 add ax,bx ; ax = x / 16 + y * 40 mov byte ptr [di+2],al ; set EAD_L mov al,ah ; discard EAD_L xor ah,ah ; clear higher byte pop bx ; recall plane offset mov bl,bh ; mov to lower byte xor bh,bh ; clear higher byte add ax,bx ; add plane offset mov byte ptr [di+3],al ; set EAD_M mov al,ah ; discard EAD_M xor ah,ah ; clear higher byte pop bx ; recall x and bx,000fh ; lower 4 bits of x (dAD) mov cl,4 ; shift counts shl bx,cl ; shift 4 bits add ax,bx ; add to EAD_H mov byte ptr [di+4],al ; set dAD+EAD_H add di,5 ; set next pointer pop cx pop bx pop ax ret gcsrw endp ;------------------------------------------------------------------------------ gline proc near ; ; Draw line from current position to the displacement (AX,BX) ; Inputs: ; ax: delta_x ; bx: delta_y ; di: buffer address ; Outputs: ; di: next buffer address ; push ax push bx push cx mov byte ptr [di],4ch ; VECTW command mov byte ptr [di+1],9 ; number of parameters ; ; determine direction (cx) ; mov cx,8 ; Line function with dir=0 cmp ax,0 ; if delta_x = 0 then je gln0 ; goto gln0 jl gln1 ; else if delta_x < 0 goto gln1 jmp gln2 ; else goto gln2 gln0: cmp bx,0 ; jge gln2 ; if delta_y >= 0 goto gln2 gln1: neg ax ; delta_x = -delta_x neg bx ; delta_y = -delta_y add cx,4 ; dir >= 4 gln2: cmp bx,0 ; jg gln3 ; if delta_y > 0 goto gln3 neg bx ; delta_y = -delta_y xchg ax,bx ; add cx,2 ; dir >= 2 or 6 gln3: cmp ax,bx ; jl gln4 ; if delta_x < delta_y goto gln4 inc cx ; dir = 1, 3, 5, or 7 jmp gln5 gln4: xchg ax,bx gln5: ; ; end of direction determination. ; ax: abs(d_x) ; bx: abs(d_y) ; cx: line_code + dir ; mov byte ptr [di+2],cl ; P1 ready mov word ptr [di+3],ax ; abs(d_x) mov cx,bx ; cx = abs(d_y) add cx,bx ; cx = 2*abs(d_y) push cx ; save 2*abs(d_y) for later use sub cx,ax ; cx = 2*abs(d_y)-abs(d_x) mov word ptr [di+5],cx ; send it sub cx,ax ; cx = 2*abs(d_y)-2*abs(d_x) mov word ptr [di+7],cx ; send it pop cx ; recall 2*abs(d_y) mov word ptr [di+9],cx ; send it ; mov byte ptr [di+11],6ch ; VECTE command mov byte ptr [di+12],0 ; with no parameters add di,13 ; update address pop cx pop bx pop ax ret gline endp ;----------------------------------- gdisp_on proc near push ax push si mov al,gdisp_mode out 6ah,al mov si,offset ggdc_on call send_to_GGDC pop si pop ax ret gdisp_on endp ;----------------------------------- gdisp_off proc near push si mov si,offset ggdc_off call send_to_GGDC pop si ret gdisp_off endp ;----------------------------------- gcls proc near push ax push bx push cx push di push si push es ; mov si,offset ggdc_off ; off the graphic GDC call send_to_GGDC ; cld ; normal direction xor ch,ch mov cl,gplane_nums mov bx,offset gplane_segm ; GDC segment address gcls_1: mov ax,[bx] ; get segment mov es,ax ; and set it to ES xor ax,ax ; store 0 mov di,ax ; offset address is 0 push cx ; save counter mov cx,16000 ; number of words of G-VRAM rep stosw ; store it pop cx ; remember number of planes add bx,2 ; next segment address loop gcls_1 ; mov si,offset ggdc_on ; on the graphic GDC call send_to_GGDC ; pop es pop si pop di pop cx pop bx pop ax ret gcls endp code ends end