home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / msvp98b1.lzh / MSGP98.ASM next >
Assembly Source File  |  1991-12-04  |  97KB  |  4,790 lines

  1. ;+ This is MSGP98.ASM
  2. ;
  3. ;  Tektronix 4014 emulator for NEC-PC9801
  4. ;  Author: Hirofumi Fujii (KEK On-line group)
  5. ;
  6. ; Last edited 17-Apr-1991
  7. ; 17-Apr-1991   Joe (and Rikitake) pointed out that tek_gtxt: should be
  8. ;               'tek_gtxt proc near'.
  9. ; 09-Mar-1991   Joe pointed out that CAN is reserved word for MASM 5.
  10. ;               CAN -> CL_CAN
  11. ;               SUB -> CL_SUB
  12. ; 01-Sep-1990    Start TEK4105 coding
  13. ; 09-Aug-1990    Add protection for coordinates in TEK40_DEV_COOD.
  14. ; 24-Jul-1990    for MS-Kermit v3.02
  15. ; 10-Jul-1990    ESC[1;30m gives white line for gnuplot v2.0
  16. ; 25-Jun-1990    Support for ESC [ XX ; YY ; .. ; ZZ m
  17. ; 30-May-1989   Fixed bug in background color.
  18. ;               Reset command resets color to default (color in command mode).
  19. ; 21-Apr-1989   Cooked logging is added
  20. ; 13-Feb-1989    Fill 0FFh of all RAM of the GGDC when tek4014_save is called.
  21.  
  22. GGDC_STS_PORT    equ    0A0h
  23. GGDC_CMD_PORT    equ    0A2h
  24. GGDC_PRM_PORT    equ    0A0h
  25.  
  26. GGDC_BLUE_PLANE        equ    04000h
  27. GGDC_RED_PLANE        equ    08000h
  28. GGDC_GREEN_PLANE    equ    0C000h
  29.  
  30. GGDC_GIN_PLANE        equ    04000h
  31. GGDC_GCUR_PLANE        equ    04000h
  32.  
  33. CPU_BLUE_PLANE    equ    0A800h
  34. CPU_RED_PLANE    equ    0B000h
  35. CPU_GREEN_PLANE    equ    0B800h
  36. CPU_EXTRA_PLANE    equ    0E000h
  37.  
  38. TEK_X_MAX    equ    4095
  39. TEK_Y_MAX    equ    3071
  40. TEK_DX        equ    56
  41. TEK_DY        equ    112
  42.  
  43. TEK41_NO_ACT    equ    0
  44. TEK41_XY_TYPE    equ    1
  45. TEK41_INT_TYPE    equ    2
  46. TEK41_STR_TYPE    equ    3
  47. TEK41_IAR_TYPE    equ    4
  48.  
  49. TEK41_ARGBUF_SIZE    equ    512
  50. TEK41_FABUF_SIZE    equ    1024
  51.  
  52. BS        equ    008h
  53. HT        equ    009h
  54. VT        equ    00Bh
  55. CL_CAN        equ    018h
  56. CL_SUB        equ    01Ah
  57. FS        equ    01Ch
  58. GS        equ    01Dh
  59. RS        equ    01Eh
  60. US        equ    01Fh
  61.  
  62. HIY        equ    020h
  63. EXT        equ    060h
  64. LOY        equ    060h
  65. HIX        equ    020h
  66. LOX        equ    040h
  67.  
  68. X_OFS        equ    64
  69. Y_OFS        equ    8
  70.  
  71. SIXEL_IN_REPEAT        equ    1
  72. SIXEL_IN_PALETTE    equ    2
  73.  
  74. SIXEL_YMAX    equ    378        ; 24 x 16 - 6
  75. SIXEL_XMAX    equ    639
  76.  
  77.     include mssdef.h
  78.     include    msxp98.h
  79.  
  80.     public    tek4014,tek4014_ini,tek4014_reset
  81.     public    tek4014_save, tek4014_restore, tek4014_modlin
  82.     public    tek4014_color
  83.     public    tekstat
  84.     public    gdisp_on, gdisp_off, set_gcolor
  85.     public    sixel, sixel_in, sixel_clear
  86.     public    sixel_rollup, sixel_rolldown
  87.     public    set_gpalette
  88.  
  89. data     segment
  90.  
  91.     extrn    vt100_flags:byte, vt100_lflag:byte, vt100_gflag:byte
  92.     extrn    vtgrph_flg:byte
  93.     extrn    display_mode:byte
  94.     extrn    gnrm_color:byte, gbck_color:byte    ; in MSYP98.ASM
  95.     extrn    def_color:byte, scn_color:byte
  96.     extrn    vt100_cursr:word            ; in MSXP98.ASM
  97.  
  98. gdisp_mode    db    0        ; digital(0)/analogue(1) display
  99. gplane_nums    db    3        ; number of graphic planes (3 or 4)
  100. gplane_actv    dw    15        ; active plane mask
  101. gplane_segm    dw    0A800h        ; CPU segment address of G-VRAM
  102.         dw    0B000h
  103.         dw    0B800h
  104.         dw    0E000h
  105. ;
  106. pc98_mouse_type    db    1
  107. pc98_mouse_init    db    0
  108. pc98_mouse_char    db    0,'1','2','3'
  109. ;
  110. tek_dialog_area    db    0
  111. tek_dialog_vsbl    db    0
  112. ;
  113. ; Color mode
  114. ; <int1> 0: no change       <int2>  0: no change    <int3> 0:nochange
  115. ;        1: RGB [0-100]             1: opake               1:color
  116. ;        2: CMY [0-100]             2: sub                 2:monochrome
  117. ;        3: HLS                     3: add
  118. ;        4: RGB [0-255]
  119. ;
  120. tek_cmode_1    db    3
  121. tek_cmode_2    db    1
  122. tek_cmode_3    db    1
  123.         db    0        ; for alignment
  124. ;
  125. ; Window and Viewport (Ordering is important.)
  126. ;
  127. tek_wnx1    dw    0
  128. tek_wnx2    dw    4095
  129. tek_wny1    dw    0
  130. tek_wny2    dw    3071
  131. ;
  132. tek_vpx1    dw    0
  133. tek_vpx2    dw    4095
  134. tek_vpy1    dw    0
  135. tek_vpy2    dw    3071
  136. ;
  137. ; Transformation Matrix from Window to Viewport.
  138. ; 16-bit fixed decimal point number.
  139. ;
  140. tek_w2v_mat    dw    8 dup (?)
  141. ;
  142. ; Window/Viewport for GIN (Viewport must be first)
  143. ;
  144. gin_vpx1    dw    0
  145. gin_vpx2    dw    479
  146. gin_vpy1    dw    0
  147. gin_vpy2    dw    359
  148. ;
  149. gin_wnx1    dw    0
  150. gin_wnx2    dw    4095
  151. gin_wny1    dw    0
  152. gin_wny2    dw    3071
  153. ;
  154. ; Viewport to Window transformation matrix
  155. ;
  156. gin_v2w_mat    dw    8 dup (?)
  157. ;
  158. ;
  159. ; Character vectors
  160. ;
  161. tek_gtxt_ang    dw    0
  162. tek_gtxt_w    dw    39
  163. tek_gtxt_h    dw    52
  164. tek_gtxt_s    dw    13
  165. tek_gtxt_dr    db    2, 0        ; graph text dir for GDC
  166. tek_gtxt_ux    dw    52
  167. tek_gtxt_uy    dw    0
  168. tek_gtxt_vx    dw    0
  169. tek_gtxt_vy    dw    52
  170. ;
  171. sixel_replace    db    0, 1
  172. sixel_state    db    0
  173. sixel_char    db    0
  174. sixel_on    db    0
  175. sixel_off    db    0
  176. sixel_x        dw    0
  177. sixel_y        dw    0
  178. repeat_count    dw    0
  179. sixel_pal_dest    dw    0
  180. sixel_palette    dw    0, 0, 0, 0, 0
  181. sixel_nbuf    dw    0
  182. sixel_byte    dw    0
  183. sixel_segm    dw    0
  184. ;
  185. vt_buf        db    8 dup (?)
  186. vt_dialog_clr    db    7,ESCAPE,"[2J",ESCAPE,"[H"
  187. ;
  188. tek_zero    dw    0        ; Zero for clearing mode line
  189. tek_cur_x    dw    0        ; TEK current position x
  190. tek_cur_y    dw    0        ; TEK current position y
  191. tek_req_x    dw    0        ; TEK requested position x
  192. tek_req_y    dw    0        ; TEK requested position y
  193. ;
  194. tek_lncol    dw    1        ; TEK line color
  195. tek_txcol    dw    1        ; TEK text color
  196. tek_facol    dw    1        ; TEK fill area color
  197. ;
  198. loc_x        dw    0        ; locator position in DC
  199. loc_y        dw    0
  200. loc_mov        dw    0
  201. ;
  202. tek_npnt    dw    0
  203. ;
  204. line_type    dw    0
  205. ;
  206. ; NOTE:
  207. ;  Bit 0 must be 1 if you want to start ON bit.
  208. line_type_table    dw    0FFFFh
  209.         dw    01111h
  210.         dw    02727h
  211.         dw    00F0Fh
  212.         dw    000FFh
  213.         dw    03E49h
  214.         dw    018FFh
  215.         dw    03333h
  216. ;
  217. marker_type    dw    0
  218. ;
  219. tek41_cmd    dw    0
  220. tek41_func    dw    0
  221. tek41_nget    dw    0
  222. tek41_narg    dw    0
  223. tek41_nreq    db    0        ; next requested data type
  224. tek41_nact    db    0        ; next action
  225. tek41_argt    db    8 dup (0)
  226. tek41_ival    dw    0
  227. ;
  228. tek_P_prv    db    0,0
  229. tek_P_num    dw    0
  230. tek_P_pnt    dw    0
  231. tek_P_buf    dw    32 dup (0)
  232. ;
  233. tek_vseq    db    0
  234. tek_cur_HIY    db    0
  235. tek_cur_EXT    db    0
  236. tek_cur_LOY    db    0
  237. tek_cur_HIX    db    0
  238. tek_cur_LOX    db    0
  239. ;
  240. tek_mod        db    0        ; 0=Alpha,1=Vector,2=Plot,3=Increment
  241. tek_esc        db    0        ; 1=TEK in esc-seq, 2= in CSI-seq
  242. tek_byp        db    0        ; 1=Bypass mode
  243. tek_cur        db    0        ; 0=Alpha cursor off, 1=on
  244. tek_pen        db    0        ; 0=Pen Up, 1=Pen down
  245. tek_hgt        db    0        ; 0=Normal, 1=HighLight
  246. ;
  247. tek_inpanel    db    0
  248. tek_panel_bnd    db    0
  249. tek_famod    db    0
  250. tek_fapat    db    0
  251. ;
  252. tek_col0    db    0,1,2,3,4,5,6,7    ; default color index table
  253. ;
  254. ; Default Tek mode color table (R,G,B)  [0-255]
  255. ;
  256. tek_col_def    db    000h,000h,000h    ;  0:black
  257.         db    0ffh,0ffh,0ffh    ;  1:white
  258.         db    0ffh,000h,000h    ;  2:red
  259.         db    000h,0ffh,000h    ;  3:green
  260.         db    000h,000h,0ffh    ;  4:blue
  261.         db    000h,0ffh,0ffh    ;  5:cyan
  262.         db    0ffh,000h,0ffh    ;  6:magenta
  263.         db    0ffh,0ffh,000h    ;  7:yellow
  264.         db    0ffh,0afh,000h    ;  8:orange
  265.         db    0afh,0ffh,000h    ;  9:yellow-green
  266.         db    000h,0ffh,0afh    ; 10:green-cyan
  267.         db    000h,0afh,0ffh    ; 11:blue-cyan
  268.         db    0afh,000h,0ffh    ; 12:blue-magenta
  269.         db    0ffh,000h,0afh    ; 13:red-magenta
  270.         db    07fh,07fh,07fh    ; 14:dark-gray
  271.         db    0afh,0afh,0afh    ; 15:light-gray
  272. ;
  273. ; Tek mode color table (R,G,B)  [0-255]
  274. ;
  275. tek_col        db    000h,000h,000h    ;  0:black
  276.         db    0ffh,0ffh,0ffh    ;  1:white
  277.         db    0ffh,000h,000h    ;  2:red
  278.         db    000h,0ffh,000h    ;  3:green
  279.         db    000h,000h,0ffh    ;  4:blue
  280.         db    000h,0ffh,0ffh    ;  5:cyan
  281.         db    0ffh,000h,0ffh    ;  6:magenta
  282.         db    0ffh,0ffh,000h    ;  7:yellow
  283.         db    0ffh,0afh,000h    ;  8:orange
  284.         db    0afh,0ffh,000h    ;  9:yellow-green
  285.         db    000h,0ffh,0afh    ; 10:green-cyan
  286.         db    000h,0afh,0ffh    ; 11:blue-cyan
  287.         db    0afh,000h,0ffh    ; 12:blue-magenta
  288.         db    0ffh,000h,0afh    ; 13:red-magenta
  289.         db    07fh,07fh,07fh    ; 14:dark-gray
  290.         db    0afh,0afh,0afh    ; 15:light-gray
  291. ;
  292. ; Sixel mode color table (R,G,B)  [0-255]
  293. ; Note that only plane #3 is used for sixel.
  294. ;
  295. sixel_col0    db    000h,000h,000h    ;  0:black
  296.         db    000h,000h,000h    ;  1
  297.         db    000h,000h,000h    ;  2
  298.         db    000h,000h,000h    ;  3
  299.         db    0ffh,0ffh,0ffh    ;  4
  300.         db    0ffh,0ffh,0ffh    ;  5
  301.         db    0ffh,0ffh,0ffh    ;  6
  302.         db    0ffh,0ffh,0ffh    ;  7
  303.         db    000h,000h,000h    ;  8
  304.         db    000h,000h,000h    ;  9
  305.         db    000h,000h,000h    ; 10
  306.         db    000h,000h,000h    ; 11
  307.         db    0ffh,0ffh,0ffh    ; 12
  308.         db    0ffh,0ffh,0ffh    ; 13
  309.         db    0ffh,0ffh,0ffh    ; 14
  310.         db    0ffh,0ffh,0ffh    ; 15
  311. ;
  312. sixel_col    db    000h,000h,000h    ;  0:black
  313.         db    000h,000h,000h    ;  1
  314.         db    000h,000h,000h    ;  2
  315.         db    000h,000h,000h    ;  3
  316.         db    0ffh,0ffh,0ffh    ;  4
  317.         db    0ffh,0ffh,0ffh    ;  5
  318.         db    0ffh,0ffh,0ffh    ;  6
  319.         db    0ffh,0ffh,0ffh    ;  7
  320.         db    000h,000h,000h    ;  8
  321.         db    000h,000h,000h    ;  9
  322.         db    000h,000h,000h    ; 10
  323.         db    000h,000h,000h    ; 11
  324.         db    0ffh,0ffh,0ffh    ; 12
  325.         db    0ffh,0ffh,0ffh    ; 13
  326.         db    0ffh,0ffh,0ffh    ; 14
  327.         db    0ffh,0ffh,0ffh    ; 15
  328. ;
  329. tek41_col    db    0,7,2,4,1,5,3,6
  330.         db    7,7,2,4,1,5,3,6
  331. ;
  332. disp_bank    db    0
  333. actv_bank    db    0
  334. ;
  335. tek41_larg    dw    0
  336. tek41_argbuf    db    TEK41_ARGBUF_SIZE dup (?)
  337.         dw    0                ; for guard
  338. tek41_lstr    dw    0        ; string length
  339. tek41_nchr    dw    0        ; number of char gotten
  340. tek41_liar    dw    0        ; INT array size
  341. tek41_niar    dw    0        ; number of INT gotten
  342. tek41_faadr    dw    0
  343. tek41_numbnd    dw    0
  344. tek41_nfa    dw    0
  345. tek41_lfa    dw    0
  346. tek41_fabuf    db    TEK41_FABUF_SIZE dup (?)
  347. ;
  348. scan_n        dw    0                ; number of lines
  349. scan_x        dw    0
  350. scan_y        dw    0
  351. scan_ofs    dw    0        ; offset address in the graphic plane
  352. scan_xstr    dw    0
  353. scan_xlen    dw    0
  354. scan_xmin    dw    0
  355. scan_xmax    dw    0
  356. scan_ymin    dw    0
  357. scan_ymax    dw    0
  358. ;
  359. scan_buf    db    80 dup (?)
  360. scan_fil    db    0, 0
  361. ;
  362. pc98_x1        dw    0
  363. pc98_y1        dw    0
  364. pc98_x2        dw    0
  365. pc98_y2        dw    0
  366. ;
  367. HLS_n1        dw    0
  368. HLS_n2        dw    0
  369. ;
  370. ggdc_buff    db    80 dup (?)
  371. loc_x_buff    db    32 dup (?)
  372. loc_y_buff    db    32 dup (?)
  373. alp_cur_buff    db    48 dup (?)
  374. ;
  375. alp_cur_font    db    000h,000h,000h,000h,000h,07eh,07eh,000h
  376. ;
  377. GDC_plane_address    db    040h, 080h, 0C0h, 000h
  378. col_indx_tab_N    db    0, 2, 4, 6, 1, 3, 5, 7    ; color index for Normal
  379. col_indx_tab_H    db    7, 2, 4, 6, 1, 3, 5, 7    ; color index for HighLight
  380. ;
  381. ext_gin        db    023h,000h,0FFh,000h
  382. ent_gin        db    021h,000h            ; complement
  383.         db    078h,008h
  384.         db    0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  385.         db    0FFh,000h
  386. gin_ans        db    006h,020h,020h,020h,020h,020h,00Dh,004h
  387. ;
  388. ggdc_solid    db    078h,008h
  389.         db    0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
  390.         db    0FFh,000h
  391. ggdc_on        db    00Dh,000h,0FFh,000h
  392. ggdc_off    db    00Ch,000h,0FFh,000h
  393. ;
  394. ggdc_set    db    04Bh,001h,000h            ; CSFORM
  395.         db    070h,004h,000h,000h,000h,019h    ; SCROLL
  396.         db    023h,000h            ; WRITE MODE SET
  397.         db    0FFh                ; terminator
  398. ;
  399. bit_on    db    080h, 040h, 020h, 010h, 008h, 004h, 002h, 001h
  400. bit_off    db    07Fh, 0BFh, 0DFh, 0EFh, 0F7h, 0FBh, 0FDh, 0FEh
  401. ;------------------------------------------------------------------------------
  402. ; 8 x 8 marker font
  403. ;
  404. ; offset
  405. ;
  406. mark_dx        dw    -4
  407. mark_dy        dw    4
  408. ;
  409. gmark88    db    000h,000h,000h,008h,000h,000h,000h,000h    ; dot
  410.     db    000h,000h,008h,01ch,008h,000h,000h,000h ; small plus
  411.     db    008h,008h,008h,07fh,008h,008h,008h,000h ; large plus
  412.     db    041h,022h,014h,07fh,014h,022h,041h,000h    ; star
  413.     db    01ch,022h,041h,041h,041h,022h,01ch,000h    ; circle
  414.     db    041h,022h,014h,008h,014h,022h,041h,000h    ; cross
  415.     db    07fh,041h,041h,041h,041h,041h,07fh,000h    ; square
  416.     db    008h,014h,022h,041h,022h,014h,008h,000h    ; 
  417.     db    07fh,041h,049h,05dh,049h,041h,07fh,000h    ; square-dot
  418.     db    008h,014h,02ah,05dh,02ah,014h,008h,000h    ;
  419.     db    07fh,063h,055h,049h,055h,063h,07fh,000h    ; square-cross
  420. ;------------------------------------------------------------------------------
  421. ; text font table (8 x 8)
  422. ;
  423. gfont88    db      000h,000h,000h,000h,000h,000h,000h,000h    ; space
  424.     db    008h,008h,008h,008h,000h,000h,008h,000h    ; !
  425.     db    022h,022h,022h,000h,000h,000h,000h,000h    ; "
  426.     db    024h,024h,07eh,024h,07eh,024h,024h,000h    ; #
  427.     db      008h,07eh,009h,03eh,048h,03fh,008h,000h    ; $
  428.         db      043h,021h,010h,008h,004h,042h,061h,000h    ; %
  429.         db      006h,009h,009h,006h,049h,031h,04eh,000h    ; &
  430.         db      018h,010h,008h,000h,000h,000h,000h,000h    ; '
  431.         db      010h,008h,004h,004h,004h,008h,010h,000h    ; (
  432.         db      004h,008h,010h,010h,010h,008h,004h,000h    ; )
  433.         db      000h,022h,014h,07fh,014h,022h,000h,000h ; *
  434.         db      000h,008h,008h,07fh,008h,008h,000h,000h    ; +
  435.         db      000h,000h,000h,000h,00ch,008h,004h,000h    ; ,
  436.         db      000h,000h,000h,03eh,000h,000h,000h,000h    ; -
  437.         db      000h,000h,000h,000h,000h,00ch,00ch,000h    ; .
  438.         db      040h,020h,010h,008h,004h,002h,001h,000h    ; /
  439.         db      03ch,062h,052h,05ah,046h,046h,03ch,000h    ; 0
  440.         db      008h,00ch,008h,008h,008h,008h,01ch,000h    ; 1
  441.         db      01ch,022h,020h,018h,004h,002h,03eh,000h    ; 2
  442.         db      03eh,020h,010h,018h,020h,022h,01ch,000h    ; 3
  443.         db      010h,018h,014h,012h,03fh,010h,010h,000h    ; 4
  444.         db      03eh,002h,01eh,022h,020h,022h,01ch,000h    ; 5
  445.         db      018h,004h,002h,01eh,022h,022h,01ch,000h    ; 6
  446.         db      03eh,020h,010h,008h,004h,004h,004h,000h    ; 7
  447.         db      03ch,042h,042h,03ch,042h,042h,03ch,000h    ; 8
  448.         db      01ch,022h,022h,03ch,020h,010h,008h,000h    ; 9
  449.         db      000h,00ch,00ch,000h,00ch,00ch,000h,000h    ; :
  450.         db      000h,00ch,00ch,000h,00ch,008h,004h,000h    ; ;
  451.         db      020h,010h,008h,004h,008h,010h,020h,000h    ; <
  452.         db      000h,000h,07eh,000h,07eh,000h,000h,000h    ; =
  453.         db      002h,004h,008h,010h,008h,004h,002h,000h    ; >
  454.         db      03ch,042h,030h,008h,008h,000h,008h,000h    ; ?
  455.         db      03ch,042h,071h,049h,039h,002h,03ch,000h    ; @
  456.         db      01ch,022h,022h,03eh,022h,022h,022h,000h    ; A
  457.         db      01fh,022h,022h,01eh,022h,022h,01fh,000h    ; B
  458.         db      01ch,022h,002h,002h,002h,022h,01ch,000h    ; C
  459.         db      01fh,022h,022h,022h,022h,022h,01fh,000h    ; D
  460.         db      03eh,002h,002h,01eh,002h,002h,03eh,000h    ; E
  461.         db      03eh,002h,002h,01eh,002h,002h,002h,000h    ; F
  462.         db      01ch,022h,002h,002h,072h,022h,01ch,000h    ; G
  463.         db      022h,022h,022h,03eh,022h,022h,022h,000h    ; H
  464.         db      01ch,008h,008h,008h,008h,008h,01ch,000h    ; I
  465.         db      070h,020h,020h,020h,022h,022h,01ch,000h    ; J
  466.         db      042h,022h,012h,00eh,012h,022h,042h,000h    ; K
  467.         db      002h,002h,002h,002h,002h,002h,03eh,000h    ; L
  468.         db      041h,063h,055h,049h,041h,041h,041h,000h    ; M
  469.         db      042h,046h,04ah,052h,062h,042h,042h,000h    ; N
  470.         db      01ch,022h,022h,022h,022h,022h,01ch,000h    ; O
  471.         db      01eh,022h,022h,01eh,002h,002h,002h,000h    ; P
  472.         db      03ch,042h,042h,042h,052h,022h,05ch,000h    ; Q
  473.         db      01eh,022h,022h,01eh,012h,022h,042h,000h    ; R
  474.         db      01ch,022h,002h,01ch,020h,022h,01ch,000h    ; S
  475.         db      03eh,008h,008h,008h,008h,008h,008h,000h    ; T
  476.         db      022h,022h,022h,022h,022h,022h,01ch,000h    ; U
  477.         db      041h,041h,022h,022h,014h,014h,008h,000h    ; V
  478.         db      041h,041h,041h,041h,049h,055h,022h,000h    ; W
  479.         db      041h,022h,014h,008h,014h,022h,041h,000h    ; X
  480.         db      041h,022h,014h,008h,008h,008h,008h,000h    ; Y
  481.         db      03eh,020h,010h,008h,004h,002h,03eh,000h    ; Z
  482.         db      038h,008h,008h,008h,008h,008h,038h,000h    ; [
  483.         db      001h,002h,004h,008h,010h,020h,040h,000h    ; backslash
  484.         db      00eh,008h,008h,008h,008h,008h,00eh,000h    ; ]
  485.         db      008h,014h,022h,000h,000h,000h,000h,000h    ; ^
  486.         db      000h,000h,000h,000h,000h,000h,07fh,000h    ; _
  487.     db    018h,008h,000h,000h,000h,000h,000h,000h    ; left quote
  488.     db    000h,000h,01ch,020h,03ch,022h,07ch,000h    ; a
  489.     db    002h,002h,01ah,026h,022h,022h,01eh,000h    ; b
  490.     db    000h,000h,01ch,022h,002h,002h,03ch,000h    ; c
  491.         db    020h,020h,02ch,032h,022h,022h,03ch,000h    ; d
  492.     db    000h,000h,01ch,022h,01eh,002h,03ch,000h    ; e
  493.     db    038h,044h,004h,01eh,004h,004h,004h,000h    ; f
  494.     db    000h,000h,01ch,022h,022h,03ch,022h,01ch    ; g
  495.     db    002h,002h,01ah,026h,022h,022h,022h,000h    ; h
  496.     db    008h,000h,008h,008h,008h,008h,010h,000h    ; i
  497.     db    020h,000h,020h,020h,020h,020h,022h,01ch    ; j
  498.     db    002h,002h,022h,012h,01ah,026h,042h,000h    ; k
  499.     db    008h,008h,008h,008h,008h,008h,010h,000h    ; l
  500.     db    000h,000h,037h,049h,049h,049h,041h,000h    ; m
  501.     db    000h,000h,03ah,046h,042h,042h,042h,000h    ; n
  502.     db    000h,000h,01ch,022h,022h,022h,01ch,000h    ; o
  503.     db    000h,000h,01eh,022h,022h,01eh,002h,002h    ; p
  504.     db    000h,000h,01ch,022h,022h,03ch,020h,060h    ; q
  505.     db    000h,000h,03ah,046h,002h,002h,002h,000h    ; r
  506.     db    000h,000h,03ch,002h,01ch,020h,01eh,000h    ; s
  507.     db    008h,008h,03eh,008h,008h,008h,030h,000h    ; t
  508.     db    000h,000h,022h,022h,022h,022h,05ch,000h    ; u
  509.     db    000h,000h,022h,022h,022h,014h,008h,000h    ; v
  510.     db    000h,000h,041h,041h,049h,049h,036h,000h    ; w
  511.     db    000h,000h,022h,014h,008h,014h,022h,000h    ; x
  512.     db    000h,000h,022h,022h,022h,03ch,022h,01ch    ; y
  513.     db    000h,000h,03eh,010h,008h,004h,03eh,000h    ; z
  514.     db    030h,008h,010h,00eh,010h,008h,030h,000h    ; {
  515.     db    008h,008h,008h,000h,008h,008h,008h,000h    ; |
  516.     db    006h,008h,004h,038h,004h,008h,006h,000h    ; }
  517.     db    000h,040h,03ch,002h,000h,000h,000h,000h    ; ~
  518.     db    012h,049h,024h,012h,049h,024h,012h,049h    ; del
  519. ;---------------------------------------------------------------------------
  520. func41    dw    'LE'
  521.     dw    tek41_exec_LE
  522.     db    0,0,0,0,0,0
  523. ;
  524.     dw    'LP'
  525.     dw    tek41_exec_LP
  526.     db    2,TEK41_XY_TYPE,TEK41_INT_TYPE,0,0,0
  527. ;
  528.     dw    'LV'
  529.     dw    tek41_exec_LV
  530.     db    1,TEK41_INT_TYPE,0,0,0,0
  531. ;
  532.     dw    'LZ'
  533.     dw    tek41_exec_LZ
  534.     db    0,0,0,0,0,0
  535. ;
  536.     dw    'KA'
  537.     dw    tek41_exec_KA
  538.     db    1,TEK41_INT_TYPE,0,0,0,0
  539. ;
  540.     dw    'LG'            ; draw
  541.     dw    tek41_exec_LG
  542.     db    1,TEK41_XY_TYPE,0,0,0,0
  543. ;
  544.     dw    'LF'            ; move
  545.     dw    tek41_exec_LF
  546.     db    1,TEK41_XY_TYPE,0,0,0,0
  547. ;
  548.     dw    'LH'            ; marker
  549.     dw    tek41_exec_LH
  550.     db    1,TEK41_XY_TYPE,0,0,0,0
  551. ;
  552.     dw    'LT'            ; graphic text
  553.     dw    tek41_exec_LT
  554.     db    1,TEK41_STR_TYPE,0,0,0,0
  555. ;
  556.     dw    'MC'            ; set graphtext size
  557.     dw    tek41_exec_MC
  558.     db    3,TEK41_INT_TYPE,TEK41_INT_TYPE,TEK41_INT_TYPE,0,0
  559. ;
  560.     dw    'ML'            ; set line color index
  561.     dw    tek41_exec_ML
  562.     db    1,TEK41_INT_TYPE,0,0,0,0
  563. ;
  564.     dw    'MM'            ; set marker type
  565.     dw    tek41_exec_MM
  566.     db    1,TEK41_INT_TYPE,0,0,0,0
  567. ;
  568.     dw    'MP'            ; set fill pattern
  569.     dw    tek41_exec_MP
  570.     db    1,TEK41_INT_TYPE,0,0,0,0
  571. ;
  572.     dw    'MR'            ; set graphtext rotation
  573.     dw    tek41_exec_MR
  574.     db    2,TEK41_INT_TYPE,TEK41_INT_TYPE,0,0,0
  575. ;
  576.     dw    'MT'            ; set text color index
  577.     dw    tek41_exec_MT
  578.     db    1,TEK41_INT_TYPE,0,0,0,0
  579. ;
  580.     dw    'MV'            ; set line style
  581.     dw    tek41_exec_MV
  582.     db    1,TEK41_INT_TYPE,0,0,0,0
  583. ;
  584.     dw    'NM'            ; set prompt mode
  585.     dw    tek41_exec_none
  586.     db    1,TEK41_INT_TYPE,0,0,0,0
  587. ;
  588.     dw    'RW'            ; set window
  589.     dw    tek41_exec_RW
  590.     db    2,TEK41_XY_TYPE,TEK41_XY_TYPE,0,0,0
  591. ;
  592.     dw    'TG'            ; set surface color map
  593.     dw    tek41_exec_TG
  594.     db    2,TEK41_INT_TYPE,TEK41_IAR_TYPE,0,0,0
  595. ;
  596.     dw    'TM'            ; set color mode
  597.     dw    tek41_exec_TM
  598.     db    3,TEK41_INT_TYPE,TEK41_INT_TYPE,TEK41_INT_TYPE,0,0
  599. ;
  600.     dw    '%!'            ; set command
  601.     dw    tek41_exec_SETCOM
  602.     db    1,TEK41_INT_TYPE,0,0,0,0
  603. ;
  604.     dw    0
  605.     dw    tek41_exec_unknown
  606.     db    0,0,0,0,0,0
  607. ;----------------------------------------------
  608. tek_stat_msg    db    CR,LF,"  Tek status: "
  609. tek_pmode_msg    db    "        "
  610.         db    "  color mode: "
  611. tek_cmode_msg    db    "3 1 1 "
  612.         db    "  mouse: "
  613. tek_mouse_msg    db    "      "
  614.         db    CR,LF,"  Tek Last Unknown command: "
  615. tek_unkwn_msg    dw    '  '
  616.         db    "  Tek Last Ignored command: "
  617. tek_ignor_msg    dw    '  '
  618. tek_test1_msg    db    ' '
  619. tek_test2_msg    db    ' '
  620. tek_test3_msg    db    ' '
  621. tek_test4_msg    db    ' '
  622.         db    '$'
  623. ;----------------------------------------------
  624. data    ends
  625.  
  626. code    segment
  627.  
  628.     extrn    vt100_modlin:near
  629.     extrn    outcapt:near
  630.     extrn    set_cur_color:near
  631.     extrn    set_cursor:near        ; in MSZP98
  632.     extrn    text_scrn:near        ; in MSZP98
  633.     extrn    pc98_bell:near
  634.  
  635.     assume    cs:code,ds:data,es:nothing
  636.  
  637. TEK41_W2V    PROC    NEAR
  638. ;
  639. ; Input  (ax,bx) -- coordinate in window
  640. ;          [si]  -- transformation matrix
  641. ; Output (ax,bx) -- coordinate in viewport
  642. ;
  643. ; format of the transformation matrix
  644. ;   xv = (xw - wx0)*mx + vx0
  645. ;   yv = (yw - wy0)*my + vy0
  646. ;
  647. ;   [si   ]  mx_l
  648. ;   [si+ 2]  mx_h
  649. ;   [si+ 4]  wx0
  650. ;   [si+ 6]  vx0
  651. ;   [si+ 8]  my_l
  652. ;   [si+10]  my_h
  653. ;   [si+12]  wy0
  654. ;   [si+14]  vy0
  655. ;
  656.     push    cx
  657.     push    dx
  658.     push    si
  659.     push    di
  660. ;
  661.     mov    di,bx            ; save y
  662. ;
  663.     sub    ax,[si+ 4]
  664.     push    ax            ; save (x-wx0)
  665.     xor    cx,cx
  666.     cmp    ax,0
  667.     jge    tek41_w2v_1
  668.     mov    cl,1
  669.     neg    ax
  670. tek41_w2v_1:
  671.     mul    WORD PTR [si]        ; low word
  672.     mov    bx,dx
  673.     pop    ax
  674.     mul    WORD PTR [si+ 2]    ; high word
  675.     add    bx,ax
  676.     jcxz    tek41_w2v_2
  677.     neg    bx
  678. tek41_w2v_2:
  679.     add    bx,[si+ 6]
  680. ;
  681.     mov    ax,di            ; get y
  682.     mov    di,bx            ; save result x
  683.     sub    ax,[si+12]
  684.     push    ax            ; save (y-wy0)
  685.     xor    cx,cx
  686.     cmp    ax,0
  687.     jge    tek41_w2v_3
  688.     mov    cl,1
  689.     neg    ax
  690. tek41_w2v_3:
  691.     mul    WORD PTR [si+ 8]    ; low word
  692.     mov    bx,dx
  693.     pop    ax
  694.     mul    WORD PTR [si+10]    ; high word
  695.     add    bx,ax
  696.     jcxz    tek41_w2v_4
  697.     neg    bx
  698. tek41_w2v_4:
  699.     add    bx,[si+14]
  700.     mov    ax,di
  701. ;
  702.     pop    di
  703.     pop    si
  704.     pop    dx
  705.     pop    cx
  706. ;
  707.     ret
  708. TEK41_W2V    ENDP
  709. ;-----------------------------------------------------------------------
  710. ; TEK4010/4014 terminal emulator
  711. ;-----------------------------------------------------------------------
  712. TEK40_DEV_COOD    PROC    NEAR
  713. ;
  714. ;  Transform TEK4014 coordinates to PC9801 device coordinates
  715. ;    Inputs:
  716. ;      AX: TEK4014 X coordinate ( to be replaced by device x )
  717. ;      BX: TEK4014 Y coordinate ( to be replaced by device y )
  718. ;    Outputs:
  719. ;      AX: Device X coordinate
  720. ;      BX: Device Y coordinate
  721. ;
  722.     push    si
  723.     mov    si,offset tek_w2v_mat
  724.     call    tek41_w2v
  725.     pop    si
  726. ;
  727.     push    cx
  728.     cmp    bx,399
  729.     jle    tek40_dev_cood_1
  730.     mov    bx,399
  731. tek40_dev_cood_1:
  732.     mov    cx,399
  733.     sub    cx,bx
  734.     xchg    bx,cx
  735.     cmp    ax,639
  736.     jle    tek40_dev_cood_2
  737.     mov    ax,639
  738. tek40_dev_cood_2:
  739.     pop    cx
  740.     ret
  741. ;
  742. TEK40_DEV_COOD    ENDP
  743. ;
  744. code    ends
  745.  
  746. code2    segment
  747.     assume    cs:code2
  748. tekstat        proc    far
  749.     push    ax
  750.     mov    si,offset tek_cmode_msg
  751.     mov    al,tek_cmode_1
  752.     add    al,'0'
  753.     mov    [si],al
  754.     mov    al,tek_cmode_2
  755.     add    al,'0'
  756.     mov    [si+2],al
  757.     mov    al,tek_cmode_3
  758.     add    al,'0'
  759.     mov    [si+4],al
  760. ;
  761.     mov    si,offset tek_mouse_msg
  762.     test    vtgrph_flg,MOUSE_BIT
  763.     jz    tekstat_m01
  764.     mov    al,'o'
  765.     mov    [si],al
  766.     mov    al,'n'
  767.     mov    [si+1],al
  768.     mov    al,' '
  769.     mov    [si+2],al
  770.     jmp    tekstat_m02
  771. tekstat_m01:
  772.     mov    al,'o'
  773.     mov    [si],al
  774.     mov    al,'f'
  775.     mov    [si+1],al
  776.     mov    [si+2],al
  777. tekstat_m02:
  778.     mov    al,' '
  779.     mov    [si+3],al
  780.     mov    al,pc98_mouse_type
  781.     add    al,'0'
  782.     mov    [si+4],al
  783. ;
  784.     mov    si,offset tek_pmode_msg
  785.     mov    al,tek_mod
  786.     add    al,'0'
  787.     mov    [si],al
  788.     mov    al,tek_esc
  789.     add    al,'0'
  790.     mov    [si+1],al
  791.     mov    si,offset tek_stat_msg
  792.     pop    ax
  793.     ret
  794. tekstat        endp
  795.  
  796. ;----------------------------------------------------------------------------
  797. set_tek41_mat    proc    far
  798. ;
  799. ; set the transformation matrix.
  800. ; parameter consistency must be checked before call.
  801. ; Input  [si] window xmin,xmax,ymin,ymax; viewport xmin,xmax,ymin,ymax
  802. ; Output [di] transformation matrix
  803. ;
  804.     push    ax
  805.     push    bx
  806.     push    dx
  807. ;
  808.     mov    ax,[si+10]    ; viewport xmax
  809.     sub    ax,[si+ 8]    ; viewport (xmax-xmin)
  810.     inc    ax
  811.     xor    dx,dx
  812.     mov    bx,[si+ 2]    ; window xmax
  813.     sub    bx,[si   ]    ; window (xmax-xmin)
  814.     inc    bx
  815.     div    bx
  816.     mov    [di+ 2],ax
  817.     xor    ax,ax
  818.     div    bx
  819.     mov    [di   ],ax
  820. ;
  821.     mov    ax,[si+14]    ; viewport ymax
  822.     sub    ax,[si+12]    ; viewport (ymax-ymin)
  823.     inc    ax
  824.     xor    dx,dx
  825.     mov    bx,[si+ 6]    ; window ymax
  826.     sub    bx,[si+ 4]    ; window (ymax-ymin)
  827.     inc    bx
  828.     div    bx
  829.     mov    [di+10],ax
  830.     xor    ax,ax
  831.     div    bx
  832.     mov    [di+ 8],ax
  833. ;
  834.     mov    ax,[si   ]    ; get window xmin
  835.     mov    [di+ 4],ax
  836.     mov    ax,[si+ 4]    ; get window ymin
  837.     mov    [di+12],ax
  838.     mov    ax,[si+ 8]    ; get viewport xmin
  839.     mov    [di+ 6],ax
  840.     mov    ax,[si+12]    ; get viewport ymin
  841.     mov    [di+14],ax
  842. ;
  843.     pop    dx
  844.     pop    bx
  845.     pop    ax
  846.     ret
  847. set_tek41_mat    endp
  848. code2    ends
  849.  
  850. code    segment
  851.     assume    cs:code
  852. ;
  853. TEK40_GIN    PROC    NEAR
  854. ;
  855. ;  Request locator
  856. ;
  857. ;  If we are using mouse, set the position
  858. ;
  859.     mov    pc98_mouse_type,0
  860.     test    vtgrph_flg,MOUSE_BIT        ; mouse on ?
  861.     jz    tek40_gin_00            ; no.
  862. tek40_gin_m01:
  863.     mov    ax,0                ; init mouse
  864.     mov    bx,0
  865.     int    33h
  866.     cmp    ax,-1                ; mouse available ?
  867.     jne    tek40_gin_00
  868.     cmp    bx,2                ; MS-mouse ?
  869.     jne    tek40_gin_m02            ; ne=no.
  870.     mov    pc98_mouse_type,2
  871.     jmp    tek40_gin_m03
  872. tek40_gin_m02:
  873.     mov    pc98_mouse_type,1
  874. tek40_gin_m03:
  875.     mov    cx,loc_x
  876.     mov    dx,loc_y
  877.     mov    ax,4                ; locate mouse
  878.     int    33h
  879. tek40_gin_00:
  880.     mov    si,offset ent_gin        ; write mode is complement
  881.     call    send_to_GGDC
  882.     mov    loc_mov,3
  883. ;
  884. ;    Draw X axis
  885. ;
  886. tek40_gin_01:
  887.     test    loc_mov,1
  888.     jz    tek40_gin_02
  889.     mov    di,offset loc_x_buff
  890.     mov    ax,gin_vpx1
  891.     mov    bx,loc_y
  892.     mov    cx,GGDC_GIN_PLANE        ; locator graphic plane
  893.     call    gcsrw
  894.     mov    ax,gin_vpx2
  895.     sub    ax,gin_vpx1
  896.     mov    bx,0
  897.     call    gline
  898.     mov    byte ptr [di],0FFh
  899.     mov    si,offset loc_x_buff
  900.     call    send_to_GGDC
  901. ;
  902. ;    Draw Y axis
  903. ;
  904. tek40_gin_02:
  905.     test    loc_mov,2
  906.     jz    tek40_gin_10
  907.     mov    di,offset loc_y_buff
  908.     mov    ax,loc_x
  909.     mov    bx,399
  910.     sub    bx,gin_vpy2
  911.     mov    cx,GGDC_GIN_PLANE
  912.     call    gcsrw
  913.     mov    ax,0
  914.     mov    bx,gin_vpy2
  915.     sub    bx,gin_vpy1
  916.     call    gline
  917.     mov    byte ptr [di],0FFh
  918.     mov    si,offset loc_y_buff
  919.     call    send_to_GGDC
  920. ;
  921. tek40_gin_10:
  922.     cmp    pc98_mouse_type,0        ; using mouse ?
  923.     jne    tek40_gin_m10            ; ne=yes.
  924.     jmp    tek40_gin_11
  925. tek40_gin_m10:
  926.     mov    ax,3
  927.     int    33h
  928.     cmp    pc98_mouse_type,1        ; NEC type ?
  929.     jne    tek40_gin_m12            ; ne=no.
  930.     and    ax,01h
  931.     and    bx,02h
  932.     or    bx,ax                ; MS-mouse method
  933. tek40_gin_m12:
  934.     and    bx,03h
  935.     cmp    bx,0
  936.     jne    tek40_gin_m14
  937.     cmp    cx,loc_x
  938.     jne    tek40_gin_m14
  939.     cmp    dx,loc_y
  940.     jne    tek40_gin_m14
  941.     mov    ah,01h                ; sense keyboard buffer
  942.     int    BIOS
  943.     cmp    bh,0
  944.     je    tek40_gin_m10
  945.     mov    ah,00h                ; read keyboard buffer
  946.     int    BIOS
  947.     jmp    tek40_gin_ex
  948. tek40_gin_m14:
  949.     mov    loc_x,cx
  950.     mov    loc_y,dx
  951.     cmp    bx,0
  952.     je    tek40_gin_m16
  953.     mov    ax,bx
  954.     mov    bx,offset pc98_mouse_char
  955.     add    bx,ax
  956.     mov    al,[bx]
  957.     jmp    tek40_gin_ex
  958. ;
  959. tek40_gin_m16:
  960.     mov    si,offset loc_x_buff
  961.     call    send_to_GGDC
  962.     mov    si,offset loc_y_buff
  963.     call    send_to_GGDC
  964.     mov    loc_mov,3
  965.     jmp    tek40_gin_01
  966. ;
  967. ;    If we are using mouse, read mouse.
  968. ;    Otherwise, scan Keyboard
  969. ;
  970. tek40_gin_11:
  971.     mov    dx,1
  972.     mov    ah,1            ; sense keyborad buffer
  973.     int    18h            ; BIOS call
  974.     cmp    bh,0
  975.     je    tek40_gin_11
  976. ;
  977.     mov    ah,2            ; sense shift keys
  978.     int    18h
  979.     test    al,1            ; SHIFT key pressed ?
  980.     jz    tek40_gin_12
  981.     mov    dx,4
  982. tek40_gin_12:
  983.     test    al,16            ; CTRL key pressed ?
  984.     jz    tek40_gin_13
  985.     mov    dx,8
  986. tek40_gin_13:
  987. ;
  988.     mov    ah,0            ; read keyboard buffer
  989.     int    18h
  990. ;
  991.     mov    loc_mov,0
  992. ;
  993.     cmp    ax,03A00h        ; UP
  994.     je    tek40_gin_up
  995.     cmp    ax,03D00h
  996.     je    tek40_gin_down
  997.     cmp    ax,03B00h
  998.     je    tek40_gin_left
  999.     cmp    ax,03C00h
  1000.     je    tek40_gin_right
  1001. ;
  1002. ;    Alpha-Numeric key.
  1003. ;
  1004.     jmp    tek40_gin_ex
  1005. ;
  1006. tek40_gin_up:
  1007.     sub    loc_y,dx
  1008.     cmp    loc_y,9-Y_OFS
  1009.     jge    tek40_gin_y
  1010.     mov    loc_y,9-Y_OFS
  1011.     jmp    tek40_gin_y
  1012. tek40_gin_down:
  1013.     add    loc_y,dx
  1014.     cmp    loc_y,399-Y_OFS
  1015.     jle    tek40_gin_y
  1016.     mov    loc_y,399-Y_OFS
  1017. tek40_gin_y:
  1018. ;    erase X axis
  1019.     mov    si,offset loc_x_buff
  1020.     or    loc_mov,1
  1021.     jmp    tek40_gin_xy
  1022. ;
  1023. tek40_gin_left:
  1024.     sub    loc_x,dx
  1025.     cmp    loc_x,X_OFS
  1026.     jge    tek40_gin_x
  1027.     mov    loc_x,X_OFS
  1028.     jmp    tek40_gin_x
  1029. tek40_gin_right:
  1030.     add    loc_x,dx
  1031.     cmp    loc_x,511+X_OFS
  1032.     jle    tek40_gin_x
  1033.     mov    loc_x,511+X_OFS
  1034. tek40_gin_x:
  1035.     mov    si,offset loc_y_buff
  1036.     or    loc_mov,2
  1037. tek40_gin_xy:
  1038.     call    send_to_GGDC
  1039.     jmp    tek40_gin_01
  1040. ;
  1041. tek40_gin_ex:
  1042. ;
  1043. ;    set-up answerback
  1044. ;
  1045.     mov    si,offset gin_ans
  1046.     mov    [si+1],al        ; Keyboard character
  1047. ;
  1048.     mov    si,offset gin_v2w_mat
  1049.     mov    ax,loc_x
  1050.     mov    bx,399
  1051.     sub    bx,loc_y
  1052.     call    tek41_w2v
  1053.     shr    ax,1
  1054.     shr    ax,1            ; convert to 10-bit address
  1055.     shr    bx,1
  1056.     shr    bx,1            ; convert to 10-bit address
  1057. ;
  1058.     mov    si,offset gin_ans
  1059.     push    bx            ; save Y
  1060. ;
  1061.     mov    bx,ax
  1062.     mov    cx,5            ; set shift count
  1063.     shr    ax,cl            ; get HiX
  1064.     and    ax,01Fh            ; mask higher bits
  1065.     or    al,020h            ; convert to character
  1066.     mov    [si+2],al        ; set HiX
  1067.     and    bx,01Fh            ; get LoX
  1068.     or    bl,020h            ; convert to character
  1069.     mov    [si+3],bl        ; set LoX
  1070. ;
  1071.     pop    bx            ; restore Y
  1072. ;
  1073.     mov    ax,bx
  1074.     mov    cx,5            ; set shift count
  1075.     shr    ax,cl            ; get HiY
  1076.     and    ax,01Fh            ; mask higher bits
  1077.     or    al,020h            ; convert to character
  1078.     mov    [si+4],al        ; set HiY
  1079.     and    bx,01Fh            ; get LoY
  1080.     or    bl,020h            ; convert to character
  1081.     mov    [si+5],bl        ; set LoY
  1082. ;
  1083. ;    Erase cross hair cursor
  1084. ;
  1085.     mov    si,offset loc_x_buff
  1086.     call    send_to_GGDC
  1087.     mov    si,offset loc_y_buff
  1088.     call    send_to_GGDC
  1089. ;
  1090. ;    Reset write mode
  1091. ;
  1092.     mov    si,offset ext_gin
  1093.     call    send_to_GGDC
  1094. ;
  1095.     mov    tek_byp,1        ; set bypass mode
  1096.     mov    si,offset gin_ans
  1097.     xor    cx,cx
  1098.     mov    cl,[si]
  1099.     inc    si
  1100.     ret
  1101. TEK40_GIN    ENDP
  1102.  
  1103. TEK40_CURON    PROC    NEAR
  1104.     push    ax
  1105.     push    bx
  1106.     push    cx
  1107.     push    si
  1108.     push    di
  1109. ;
  1110.     mov    si,offset alp_cur_font
  1111.     mov    di,offset alp_cur_buff
  1112.     mov    byte ptr [di],078h    ; TEXTW
  1113.     mov    byte ptr [di+1],8    ; number of parameters
  1114.     add    di,2
  1115.     cld
  1116.     mov    cx,8
  1117.     push    es
  1118.     push    ds
  1119.     pop    es
  1120.     rep    movsb
  1121.     pop    es
  1122.     mov    ax,tek_cur_x
  1123.     mov    bx,tek_cur_y
  1124.     call    tek40_dev_cood
  1125.     mov    cx,GGDC_GCUR_PLANE    ; cursor graphic plane
  1126.     call    gcsrw
  1127.     mov    byte ptr [di],21h    ; write in COMPLEMENT mode
  1128.     mov    byte ptr [di+1],0
  1129.     add    di,2
  1130.     mov    byte ptr [di],04Ch    ; VEXTW
  1131.     mov    byte ptr [di+1],3    ; number of parameters
  1132.     mov    byte ptr [di+2],012h    ; normal text dir=2
  1133.     mov    byte ptr [di+3],07h
  1134.     mov    byte ptr [di+4],0
  1135.     mov    byte ptr [di+5],068h    ; TEXTE
  1136.     mov    byte ptr [di+6],0
  1137.     mov    byte ptr [di+7],0FFh    ; terminator
  1138.     mov    si,offset alp_cur_buff
  1139.     call    send_to_GGDC
  1140.     mov    tek_cur,1
  1141. ;
  1142.     pop    di
  1143.     pop    si
  1144.     pop    cx
  1145.     pop    bx
  1146.     pop    ax
  1147.     ret
  1148. TEK40_CURON    ENDP
  1149.  
  1150. TEK40_CUROFF    PROC    NEAR
  1151.     cmp    tek_cur,0
  1152.     je    tek40_curoff_ex
  1153.     push    si
  1154.     mov    si,offset alp_cur_buff
  1155.     call    send_to_GGDC
  1156.     pop    si
  1157.     mov    tek_cur,0
  1158. tek40_curoff_ex:
  1159.     ret
  1160. TEK40_CUROFF    ENDP
  1161.  
  1162. TEK4014_INI    PROC    NEAR
  1163.     call    tek4014_reset
  1164.     mov    si,offset ggdc_off
  1165.     call    send_to_GGDC
  1166.     ret
  1167. TEK4014_INI    ENDP
  1168.  
  1169. TEK4014_COLOR    PROC    NEAR
  1170. ;
  1171. ;  Set color index table
  1172. ;  [si]   foreground color
  1173. ;  [si+1] background color
  1174. ;
  1175.     push    ax
  1176.     push    di
  1177. ;
  1178.     push    si
  1179.     mov    al,[si+1]        ; background color
  1180.     xor    ah,ah
  1181.     mov    si,offset gnrm_color
  1182.     add    si,ax
  1183.     add    si,ax
  1184.     add    si,ax
  1185.     mov    di,offset tek_col    ; index 0 is background color
  1186.     mov    al,[si]
  1187.     mov    [di],al
  1188.     mov    al,[si+1]
  1189.     mov    [di+1],al
  1190.     mov    al,[si+2]
  1191.     mov    [di+2],al
  1192. ;
  1193.     push    cx
  1194.     mov    cx,4
  1195.     mov    di,offset sixel_col
  1196. tek4014_color_sxb:
  1197.     mov    al,[si]
  1198.     mov    [di],al            ; R
  1199.     mov    [di+24],al        ; R
  1200.     mov    al,[si+1]
  1201.     mov    [di+1],al        ; G
  1202.     mov    [di+25],al        ; G
  1203.     mov    al,[si+2]
  1204.     mov    [di+2],al        ; B
  1205.     mov    [di+26],al        ; B
  1206.     add    di,3
  1207.     loop    tek4014_color_sxb
  1208.     pop    cx
  1209. ;
  1210.     pop    si
  1211. ;
  1212.     push    si
  1213.     mov    al,[si]            ; foreground color
  1214.     xor    ah,ah
  1215.     mov    si,offset gnrm_color
  1216.     add    si,ax
  1217.     add    si,ax
  1218.     add    si,ax
  1219.     mov    di,offset tek_col
  1220.     add    di,3            ; index 1 is foreground color
  1221.     mov    al,[si]
  1222.     mov    [di],al
  1223.     mov    al,[si+1]
  1224.     mov    [di+1],al
  1225.     mov    al,[si+2]
  1226.     mov    [di+2],al
  1227. ;
  1228.     push    cx
  1229.     mov    cx,4
  1230.     mov    di,offset sixel_col
  1231.     add    di,12            ; start from index 4
  1232. tek4014_color_sxf:
  1233.     mov    al,[si]
  1234.     mov    [di],al            ; R
  1235.     mov    [di+24],al        ; R
  1236.     mov    al,[si+1]
  1237.     mov    [di+1],al        ; G
  1238.     mov    [di+25],al        ; G
  1239.     mov    al,[si+2]
  1240.     mov    [di+2],al        ; B
  1241.     mov    [di+26],al        ; B
  1242.     add    di,3
  1243.     loop    tek4014_color_sxf
  1244.     pop    cx
  1245. ;
  1246.     pop    si
  1247. ;@@    mov    [di+7],al
  1248. ;@@    mov    al,[si+1]
  1249. ;@@    mov    [di],al
  1250. ;@@    mov    di,offset sixel_col
  1251. ;@@    mov    al,[si]
  1252. ;@@    mov    [di+4],al
  1253. ;@@    mov    [di+5],al
  1254. ;@@    mov    [di+6],al
  1255. ;@@    mov    [di+7],al
  1256. ;@@    mov    al,[si+1]
  1257. ;@@    mov    [di],al
  1258. ;@@    mov    [di+1],al
  1259. ;@@    mov    [di+2],al
  1260. ;@@    mov    [di+3],al
  1261.     pop    di
  1262.     pop    ax
  1263.     ret
  1264. TEK4014_COLOR    ENDP
  1265.  
  1266. tek40_color    proc    near
  1267. ;
  1268. ; set color
  1269. ; input ax
  1270. ;
  1271.     push    ax            ; save register
  1272.     cmp    ax,0            ; normal intensity [0] ?
  1273.     jne    tek40_color_1        ; ne=no
  1274.     mov    tek_hgt,0        ; set normal intensity
  1275.     jmp    tek40_color_ex
  1276. tek40_color_1:
  1277.     cmp    ax,1            ; high intensity [1] ?
  1278.     jne    tek40_color_2        ; ne=no
  1279.     mov    tek_hgt,1        ; set high intensity
  1280.     jmp    tek40_color_ex
  1281. tek40_color_2:
  1282.     cmp    ax,30            ; forground color [30-37] ?
  1283.     jl    tek40_color_bk
  1284.     cmp    ax,37
  1285.     jg    tek40_color_bk
  1286.     sub    ax,30            ; OK, convert to color index
  1287.     push    bx
  1288.     mov    bx,offset col_indx_tab_N
  1289.     add    bx,ax
  1290.     cmp    tek_hgt,0        ; HighLight ?
  1291.     je    tek40_color_fg1        ; e=no
  1292.     add    bx,8
  1293. tek40_color_fg1:
  1294.     mov    al,[bx]
  1295.     pop    bx
  1296.     mov    tek_lncol,ax
  1297.     mov    tek_txcol,ax
  1298.     mov    tek_facol,ax
  1299.     jmp    tek40_color_ex
  1300. tek40_color_bk:
  1301.     cmp    ax,40            ; background color [40-47] ?
  1302.     jl    tek40_color_ex
  1303.     cmp    ax,47            ; bug fixed [30-May-1989]. Was 37.
  1304.     jg    tek40_color_ex
  1305.     sub    ax,40
  1306.     push    si
  1307.     mov    si,offset col_indx_tab_N
  1308.     add    si,ax
  1309.     mov    al,[si]
  1310.     mov    si,offset scn_color
  1311.     mov    [si+1],al
  1312.     call    tek4014_color
  1313.     mov    si,offset tek_col
  1314.     call    set_gpalette
  1315.     pop    si
  1316. tek40_color_ex:
  1317.     pop    ax            ; restore ax
  1318.     ret
  1319. tek40_color    endp
  1320.  
  1321. TEK4014_RESET    PROC    NEAR
  1322. ;
  1323. ;  Hardware initialization
  1324. ;
  1325. tek4014_reset_lp01:
  1326.     in    al,GGDC_STS_PORT
  1327.     xor    al,024h
  1328.     test    al,024h            ; VSYNC & GDC Empty ?
  1329.     jne    tek4014_reset_lp01
  1330. ;
  1331.     mov    al,disp_bank
  1332.     out    0A4h,al            ; set display bank
  1333.     mov    al,actv_bank
  1334.     out    0A6h,al            ; set active bank
  1335.     mov    al,02h            ; color mode
  1336.     out    068h,al            ; set mode F/F
  1337.     mov    al,08h            ; 400 line mode
  1338.     out    068h,al            ; set mode F/F
  1339.     mov    si,offset ggdc_set    ; CSFORM & SCROLL
  1340.     call    send_to_GGDC
  1341. ;
  1342.     cmp    display_mode,0
  1343.     je    tek4014_reset_02
  1344.     mov    gdisp_mode,1
  1345.     mov    gplane_nums,4
  1346.     jmp    tek4014_reset_03
  1347. tek4014_reset_02:
  1348.     mov    gdisp_mode,0
  1349.     mov    gplane_nums,3
  1350. tek4014_reset_03:
  1351.     mov    al,gdisp_mode        ; display mode
  1352.     out    6ah,al
  1353. ;
  1354.     call    gcls
  1355. ;
  1356. ;  Software reset
  1357. ;
  1358. ; Set color mode
  1359. ;
  1360.     mov    tek_cmode_1,3
  1361.     mov    tek_cmode_2,1
  1362.     mov    tek_cmode_3,1
  1363. ;
  1364.     push    si
  1365.     mov    si,offset def_color
  1366.     call    set_cur_color
  1367.     call    tek4014_color
  1368.     pop    si
  1369. ;
  1370. ; Set Windows
  1371. ;
  1372.     mov    tek_wnx1,0
  1373.     mov    tek_wnx2,TEK_X_MAX
  1374.     mov    tek_wny1,0
  1375.     mov    tek_wny2,TEK_Y_MAX
  1376. ;
  1377.     mov    gin_wnx1,0
  1378.     mov    gin_wnx2,TEK_X_MAX
  1379.     mov    gin_wny1,0
  1380.     mov    gin_wny2,TEK_Y_MAX
  1381. ;
  1382. ; Set Viewports
  1383. ;
  1384.     mov    tek_vpx1,X_OFS
  1385.     mov    tek_vpx2,(X_OFS+479)
  1386.     mov    tek_vpy1,Y_OFS
  1387.     mov    tek_vpy2,(Y_OFS+359)
  1388. ;
  1389.     mov    gin_vpx1,X_OFS
  1390.     mov    gin_vpx2,(X_OFS+479)
  1391.     mov    gin_vpy1,Y_OFS
  1392.     mov    gin_vpy2,(Y_OFS+359)
  1393. ;
  1394. ; Set Transformation Matricies
  1395. ;
  1396.     push    si
  1397.     push    di
  1398.     mov    si,offset tek_wnx1
  1399.     mov    di,offset tek_w2v_mat
  1400.     call    set_tek41_mat
  1401.     mov    si,offset gin_vpx1        ; viewport to window for GIN
  1402.     mov    di,offset gin_v2w_mat
  1403.     call    set_tek41_mat
  1404.     pop    di
  1405.     pop    si
  1406. ;
  1407. ; Set text parameters
  1408. ;
  1409.     mov    tek_gtxt_ang,0
  1410.     mov    tek_gtxt_w,39
  1411.     mov    tek_gtxt_h,52
  1412.     mov    tek_gtxt_s,13
  1413.     mov    tek_gtxt_dr,2
  1414.     mov    tek_gtxt_ux,52        ; w+s
  1415.     mov    tek_gtxt_uy,0
  1416.     mov    tek_gtxt_vx,0
  1417.     mov    tek_gtxt_vy,52        ; h
  1418. ;
  1419. ; Set current position
  1420. ;
  1421.     mov    tek_cur_x,0
  1422.     mov    tek_cur_y,TEK_Y_MAX
  1423.     mov    ax,TEK_DY
  1424.     sub    tek_cur_y,ax
  1425.     mov    line_type,0
  1426.     mov    marker_type,0
  1427.     mov    tek_byp,0
  1428.     mov    tek_lncol,1        ; line color is white
  1429.     mov    tek_txcol,1        ; text color is white
  1430.     mov    tek_facol,1        ; fill area color is white
  1431.     mov    tek_hgt,0        ; Normal Intensity
  1432.     mov    tek_esc,0
  1433.     mov    tek_inpanel,0
  1434.     mov    tek41_cmd,0
  1435. ;
  1436. ;    Set locator position at the center of the screen
  1437. ;
  1438.     push    bx
  1439.     mov    ax,(TEK_X_MAX+1)
  1440.     shr    ax,1
  1441.     mov    bx,(TEK_Y_MAX+1)
  1442.     shr    bx,1
  1443.     call    tek40_dev_cood
  1444.     mov    loc_x,ax
  1445.     mov    loc_y,bx
  1446.     pop    bx
  1447. ;
  1448. ;    Set color index table
  1449. ;
  1450.     push    cx
  1451.     push    di
  1452.     push    si
  1453.     push    es
  1454. ;
  1455.     push    ds
  1456.     pop    es
  1457.     mov    si,offset tek_col_def    ; source
  1458.     mov    di,offset tek_col    ; destination
  1459.     mov    cx,48            ; 16 colors x 3
  1460.     cld
  1461.     rep    movsb
  1462.     mov    si,offset tek_col
  1463.     call    set_gpalette
  1464. ;
  1465. ;    Set dialog area
  1466. ;
  1467.     mov    tek_dialog_area,0
  1468.     mov    tek_dialog_vsbl,0
  1469. ;
  1470.     pop    es
  1471.     pop    si
  1472.     pop    di
  1473.     pop    cx
  1474. ;
  1475.     call    tek40_curon
  1476. ;
  1477.     ret
  1478. TEK4014_RESET    ENDP
  1479.  
  1480. TEK4014_SAVE    PROC    NEAR
  1481. ;
  1482. ;@@    mov    si,offset tek_col0
  1483.     call    set_gpalette
  1484. ;
  1485.     mov    si,offset ggdc_solid
  1486.     call    send_to_GGDC
  1487.     mov    si,offset ggdc_off
  1488.     call    send_to_GGDC
  1489. ;
  1490. ; Clear mode line
  1491. ;
  1492.     push    dx
  1493.     mov    dx,offset tek_zero
  1494.     call    vt100_modlin
  1495.     pop    dx
  1496. ;
  1497.     push    ax
  1498.     mov    ax,vt100_cursr
  1499.     xor    al,al        ; restore cursor attributes
  1500.     call    set_cursor
  1501.     mov    ax,1
  1502.     call    text_scrn    ; text screen ON
  1503.     pop    ax
  1504. ;
  1505.     ret
  1506. TEK4014_SAVE    ENDP
  1507.  
  1508.  
  1509. TEK4014_RESTORE    PROC    NEAR
  1510. ;@@    push    ax
  1511. ;@@    mov    ax,1        ; disable text cursor
  1512. ;@@    call    set_cursor
  1513. ;@@    pop    ax
  1514. ;
  1515.     push    ax
  1516.     mov    al,display_mode
  1517.     cmp    al,gdisp_mode
  1518.     je    tek4014_restore_1
  1519.     mov    gdisp_mode,0
  1520.     mov    gplane_nums,3
  1521.     cmp    al,0
  1522.     je    tek4014_restore_2
  1523.     mov    gdisp_mode,1
  1524.     mov    gplane_nums,4
  1525. tek4014_restore_2:
  1526.     mov    al,gdisp_mode
  1527.     out    6ah,al
  1528. tek4014_restore_1:
  1529.     pop    ax
  1530. ;
  1531.     call    gdisp_on
  1532. ;
  1533.     mov    si,offset tek_col
  1534.     call    set_gpalette
  1535.     ret
  1536. TEK4014_RESTORE    ENDP
  1537.  
  1538.  
  1539. TEK4014_MODLIN    PROC    NEAR
  1540.     call    vt100_modlin
  1541.     ret
  1542. TEK4014_MODLIN    ENDP
  1543.  
  1544. ; Tek4014/Tek4105 emulator by H.Fujii (KEK)
  1545. ;
  1546. ; Carry Set if parameters need to be passed to VT100.
  1547. ; In this case, CX contains number of characters and [SI] contains the
  1548. ; string.
  1549. ;
  1550. TEK4014    PROC    NEAR
  1551.     cmp    vt100_lflag,(LOGCOOK_BIT+LOGENAB_BIT)
  1552.     jne    tek4014_01        ; ne = no.
  1553.     call    outcapt            ; log it
  1554. tek4014_01:
  1555.     call    tek40_curoff
  1556.     cmp    tek_byp,0        ; bypass mode ?
  1557.     je    tek40_00        ; e = No.
  1558.     mov    bl,al            ; Bypass mode
  1559.     and    bl,07Fh            ; Mask 8th bit
  1560.     cmp    bl,020h            ; control character ?
  1561.     jge    tek40_ex        ; ge = No.
  1562.     mov    tek_byp,0        ; Off the bypass mode
  1563. tek40_00:
  1564.     cmp    tek_esc,0        ; in ESC sequence ?
  1565.     je    tek40_01        ; e = No.
  1566.     jmp    tek40_esc
  1567. tek40_01:
  1568.     cmp    tek_mod,0        ; Alpha mode ?
  1569.     jne    tek40_02
  1570.     jmp    tek40_alp
  1571. tek40_02:
  1572.     cmp    tek_mod,1        ; Vector mode ?
  1573.     jne    tek40_03
  1574.     jmp    tek40_vct
  1575. tek40_03:
  1576.     cmp    tek_mod,2        ; Point plot mode ?
  1577.     jne    tek40_04
  1578.     jmp    tek40_vct
  1579. tek40_04:
  1580.     cmp    tek_mod,3
  1581.     jne    tek40_05
  1582.     jmp    tek40_inc
  1583. tek40_05:
  1584.     call    pc98_bell        ; Program error !!!
  1585. tek40_ex:
  1586.     cmp    tek_esc,0        ; in ESC seq ?
  1587.     jne    tek40_ex1        ; ne=yes.
  1588.     cmp    tek_dialog_area,0    ; Disable dialog ?
  1589.     jne    tek40_ex1        ; ne=no, dialog is VT screen
  1590.     cmp    tek_mod,0        ; in alpha mode ?
  1591.     jne    tek40_ex1        ; ne=no
  1592.     call    tek40_curon
  1593. tek40_ex1:
  1594.     mov    ah,0
  1595.     mov    cx,0
  1596.     clc                ; normal return
  1597.     ret
  1598. ;-----------------------------------------------------------------------
  1599. ; ESC sequence
  1600. ;-----------------------------------------------------------------------
  1601. tek40_esc:
  1602.     cmp    tek_esc,1        ; just entered ?
  1603.     je    tek40_esc1        ; e=yes.
  1604.     cmp    tek_esc,2        ; in CSI mode ?
  1605.     jne    tek40_esc_n2        ; ne=no.
  1606.     jmp    tek40_esc2
  1607. tek40_esc_n2:
  1608.     cmp    tek_esc,3        ; in 20C ?
  1609.     jne    tek40_esc_n3
  1610.     jmp    tek40_esc3
  1611. tek40_esc_n3:
  1612.     jmp    tek40_esc4
  1613. ;
  1614. tek40_esc1:
  1615.     cmp    al,020h            ; C0 character ?
  1616.     jb    tek40_esc_C0        ; b=yes.
  1617.     jmp    tek40_esc_GL
  1618. ;
  1619. tek40_esc_C0:
  1620. tek40_esc_0C:
  1621.     cmp    al,FF            ; FF ?
  1622.     jne    tek40_esc_n0C        ; ne=no.
  1623.     test    vtgrph_flg,GCLRWAIT_BIT
  1624.     jz    tek40_esc_0C_2
  1625.     push    ax
  1626.     push    bx
  1627.     call    pc98_bell
  1628. tek40_esc_0C_1:
  1629.     mov    ax,0100h
  1630.     int    BIOS
  1631.     cmp    bh,0
  1632.     je    tek40_esc_0C_1
  1633.     mov    ax,0
  1634.     int    BIOS
  1635.     pop    bx
  1636.     pop    ax
  1637. tek40_esc_0C_2:
  1638.     call    gcls            ; ESC FF clears screen
  1639.     mov    tek_esc,0        ; ESC seq done
  1640.     mov    tek_mod,0        ; enter alpha mode
  1641.     mov    tek_cur_x,0
  1642.     mov    tek_cur_y,TEK_Y_MAX
  1643.     sub    tek_cur_y,TEK_DY
  1644.     jmp    tek40_ex
  1645. tek40_esc_n0C:
  1646. ;
  1647.     cmp    al,CL_SUB        ; SUB (1A) ?
  1648.     jne    tek40_esc_n1A        ; ne=no.
  1649.     call    tek40_gin
  1650.     mov    tek_esc,0
  1651.     mov    tek_mod,0
  1652.     mov    ah,0
  1653.     clc
  1654.     ret                ; EIXT with gin answerback
  1655. tek40_esc_n1A:
  1656.     mov    tek_esc,0        ; any other C0 characters are
  1657.     jmp    tek40_C0        ; treated as a single C0 character
  1658. ;
  1659. tek40_esc_GL:
  1660.     cmp    al,'['
  1661.     je    tek40_esc_5B
  1662.     ja    tek40_esc_5C
  1663.     mov    tek_esc,3        ; in TEK4105 command mode
  1664.     xor    ah,ah
  1665.     mov    tek41_cmd,ax
  1666.     jmp    tek40_ex
  1667. tek40_esc_5B:
  1668.     mov    tek_esc,2        ; in CSI mode
  1669.     mov    bx,offset tek_P_buf
  1670.     mov    tek_P_pnt,bx
  1671.     mov    word ptr [bx],0
  1672.     mov    tek_P_num,0
  1673.     mov    tek_P_prv,0
  1674.     jmp    tek40_ex
  1675. tek40_esc_5C:
  1676.     jmp    tek40_esc_ex
  1677. ;
  1678. ; ANSI CSI sequence
  1679. ;
  1680. tek40_esc2:
  1681.     cmp    al,'0'
  1682.     jl    tek40_esc2_01
  1683.     cmp    al,'9'
  1684.     jg    tek40_esc2_01
  1685.     xor    ah,ah
  1686.     sub    al,'0'
  1687.     mov    bx,tek_P_pnt
  1688.     mov    cx,[bx]
  1689.     shl    cx,1
  1690.     shl    cx,1
  1691.     add    cx,[bx]
  1692.     shl    cx,1
  1693.     add    ax,cx
  1694.     mov    [bx],ax
  1695.     jmp    tek40_ex
  1696. tek40_esc2_01:
  1697.     cmp    al,'?'
  1698.     jne    tek40_esc2_02
  1699.     mov    tek_P_prv,al
  1700.     jmp    tek40_ex
  1701. tek40_esc2_02:
  1702.     cmp    al,';'
  1703.     jne    tek40_esc2_03
  1704.     add    tek_P_pnt,2
  1705.     mov    bx,tek_P_pnt
  1706.     mov    word ptr [bx],0
  1707.     inc    tek_P_num
  1708.     jmp    tek40_ex
  1709. tek40_esc2_03:
  1710.     cmp    al,'h'
  1711.     jne    tek40_esc2_04
  1712.     jmp    tek40_esc_ex
  1713. tek40_esc2_04:
  1714.     cmp    al,'l'
  1715.     jne    tek40_esc2_05
  1716.     jmp    tek40_vtchg
  1717. tek40_esc2_05:
  1718.     cmp    al,'m'
  1719.     jne    tek40_esc2_06
  1720.     push    ax
  1721.     push    cx
  1722.     push    si
  1723.     mov    si,offset tek_P_buf
  1724.     mov    cx,tek_P_num        ; number of parameters
  1725.     inc    cx
  1726. tek40_esc2_05a:
  1727.     mov    ax,[si]            ; get color code
  1728.     call    tek40_color
  1729.     add    si,2
  1730.     loop    tek40_esc2_05a        ; loop over all parameters
  1731.     pop    si
  1732.     pop    cx
  1733.     pop    ax
  1734.     jmp    tek40_esc_ex
  1735. tek40_esc2_06:
  1736.     jmp    tek40_esc_ex
  1737. ;
  1738. tek40_esc3:
  1739. ;
  1740. ; 20C mode
  1741. ;
  1742.     cmp    al,020h            ; C0 character ?
  1743.     jae    tek40_esc3_01        ; ae = no.
  1744.     jmp    tek40_C0
  1745. tek40_esc3_01:
  1746.     mov    bx,tek41_cmd
  1747.     mov    bh,al
  1748.     xchg    bh,bl
  1749.     mov    tek41_cmd,bx        ; stored it.
  1750.     mov    tek_esc,4        ; enter Tek41 command mode
  1751.     mov    tek41_narg,0
  1752.     mov    tek41_nget,0
  1753.     mov    tek41_larg,0
  1754. ;
  1755. ; analyze command and set number of arguments and argument types
  1756. ;
  1757.     mov    ax,bx
  1758.     mov    bx,offset func41
  1759. tek41_ana_03:
  1760.     mov    cx,[bx]
  1761.     cmp    ax,cx
  1762.     je    tek41_ana_01
  1763.     cmp    cx,0
  1764.     jne    tek41_ana_05
  1765.     add    bx,2
  1766.     mov    cx,[bx]
  1767.     mov    tek41_func,cx
  1768.     xchg    ah,al            ; change to character order
  1769.     mov    tek_unkwn_msg,ax
  1770.     xchg    ah,al
  1771.     jmp    tek40_ex
  1772. tek41_ana_05:
  1773.     add    bx,10
  1774.     jmp    tek41_ana_03
  1775. tek41_ana_01:
  1776.     add    bx,2
  1777.     mov    cx,[bx]
  1778.     mov    tek41_func,cx
  1779.     add    bx,2
  1780.     mov    cl,[bx]
  1781.     inc    bx
  1782.     xor    ch,ch
  1783.     mov    tek41_narg,cx
  1784.     cmp    cx,0
  1785.     je    tek41_ana_02
  1786.     push    si
  1787.     mov    si,offset tek41_argt
  1788. tek41_ana_04:
  1789.     mov    al,[bx]
  1790.     mov    [si],al
  1791.     inc    bx
  1792.     inc    si
  1793.     loop    tek41_ana_04
  1794.     pop    si
  1795. tek41_ana_02:
  1796.     jmp    tek41_next
  1797. ;
  1798. tek40_esc4:
  1799.     cmp    al,20h            ; C0 character ?
  1800.     jae    tek40_esc4_02        ; ae=no.
  1801.     cmp    al,ESCAPE        ; one of ESC,FS,GS,RS,US ?
  1802.     jl    tek40_esc4_01        ; l=no.
  1803.     mov    tek_esc,0        ; terminate the command
  1804.     jmp    tek40_C0        ; and treat as C0
  1805. tek40_esc4_01:
  1806.     jmp    tek40_ex        ; ignore any other C0 character.
  1807. tek40_esc4_02:
  1808.     cmp    tek41_nreq,TEK41_XY_TYPE
  1809.     jne    tek40_esc4_03
  1810.     jmp    tek41_xy
  1811. tek40_esc4_03:
  1812.     cmp    tek41_nreq,TEK41_INT_TYPE
  1813.     jne    tek40_esc4_04
  1814.     jmp    tek41_int
  1815. tek40_esc4_04:
  1816.     cmp    tek41_nreq,TEK41_STR_TYPE
  1817.     jne    tek40_esc4_05
  1818.     jmp    tek41_str
  1819. tek40_esc4_05:
  1820.     cmp    tek41_nreq,TEK41_IAR_TYPE
  1821.     jne    tek40_esc4_06
  1822.     jmp    tek41_int
  1823. tek40_esc4_06:
  1824.     jmp    tek40_ex            ; Unknown command, ignore.
  1825. ;
  1826. tek40_esc_ex:
  1827.     mov    tek_esc,0
  1828.     jmp    tek40_ex
  1829.  
  1830. ; receive and convert Tek41 type xy-coordinate
  1831. ; note that xy-coordinate system is the same as Tek401x.
  1832. ;
  1833. tek41_xy:
  1834.     jmp    tek40_vct    ; goto Tek40 type vector format analyzer
  1835. tek41_xy1:
  1836.     mov    cx,tek41_larg    ; check the room for storage
  1837.     add    cx,4
  1838.     cmp    cx,TEK41_ARGBUF_SIZE
  1839.     jae    tek41_xy2    ; ae = room is full
  1840.     mov    bx,offset tek41_argbuf
  1841.     add    bx,tek41_larg
  1842.     mov    ax,tek_req_x
  1843.     mov    [bx],ax        ; store it in buffer
  1844.     mov    ax,tek_req_y
  1845.     mov    [bx+2],ax
  1846.     add    tek41_larg,4    ; update buffer length
  1847. tek41_xy2:
  1848.     inc    tek41_nget    ; icrement number of argument we get
  1849.     jmp    tek41_next
  1850. ;
  1851. ; receive and convert Tek41 type integer
  1852. ;    7 6 5 4 3 2 1 0             7 6 5 4 3 2 1 0
  1853. ;   +-+-+-+-+-+-+-+-+           +-+-+-+-+-+-+-+-+
  1854. ;   |P|1|   value   |     ...   |P|0|1|S| value |   where S=1 if int >= 0
  1855. ;   +-+-+-+-+-+-+-+-+           +-+-+-+-+-+-+-+-+
  1856. ;
  1857. tek41_int:
  1858.     mov    ah,al        ; copy to AH
  1859.     mov    bx,tek41_ival    ; get previous value
  1860.     test    al,040h        ; Hi byte ?
  1861.     jz    tek41_int1    ; z=no
  1862.     mov    cx,6        ; shift count
  1863.     shl    bx,cl        ; shift-left previous value by 6 bits
  1864.     and    ah,03Fh
  1865.     or    bl,ah
  1866.     mov    tek41_ival,bx    ; store it
  1867.     jmp    tek40_ex    ; and continue
  1868. tek41_int1:
  1869.     mov    cx,4
  1870.     shl    bx,cl
  1871.     and    ah,00Fh
  1872.     or    bl,ah
  1873.     test    al,010h        ; check sign bit
  1874.     jnz    tek41_int2    ; nz=positive
  1875.     neg    bx        ; negative integer
  1876. tek41_int2:
  1877.     mov    ax,bx
  1878.     mov    tek41_ival,ax    ; store it
  1879.     mov    cx,tek41_larg    ; check the room for storage
  1880.     add    cx,2
  1881.     cmp    cx,TEK41_ARGBUF_SIZE
  1882.     jae    tek41_int3    ; ae = room is full
  1883.     mov    bx,offset tek41_argbuf
  1884.     add    bx,tek41_larg
  1885.     mov    [bx],ax        ; store it in buffer
  1886.     add    tek41_larg,2    ; update buffer length
  1887. tek41_int3:
  1888.     cmp    tek41_nact,TEK41_INT_TYPE    ; processing single INT ?
  1889.     jne    tek41_int4    ; ne=no.
  1890.     inc    tek41_nget    ; increment number of arg. we get
  1891.     jmp    tek41_next    ; setup for next argument
  1892. tek41_int4:
  1893.     cmp    tek41_nact,TEK41_STR_TYPE    ; processing string ?
  1894.     jne    tek41_int5    ; ne=no.
  1895.     mov    tek41_lstr,ax    ; set character length
  1896.     mov    tek41_nchr,0    ; clear the filled size
  1897.     mov    tek41_nreq,TEK41_STR_TYPE    ; next data is character
  1898.     jmp    tek40_ex    ; and continue
  1899. tek41_int5:
  1900.     cmp    tek41_nact,TEK41_IAR_TYPE    ; processing INT array ?
  1901.     jne    tek41_int8
  1902.     cmp    tek41_nreq,TEK41_INT_TYPE    ; beginning of array ?
  1903.     jne    tek41_int6
  1904.     mov    tek41_liar,ax    ; set array length
  1905.     mov    tek41_niar,0    ; clear the filled size
  1906.     mov    tek41_ival,0    ; clear the buffer
  1907.     mov    tek41_nreq,TEK41_IAR_TYPE    ; next data is INT array elem.
  1908.     jmp    tek40_ex    ; and continue
  1909. tek41_int6:
  1910.     inc    tek41_niar
  1911.     mov    cx,tek41_niar
  1912.     cmp    cx,tek41_liar
  1913.     jge    tek41_int7
  1914.     mov    tek41_ival,0    ; clear the buffer
  1915.     jmp    tek40_ex
  1916. tek41_int7:
  1917.     inc    tek41_nget
  1918.     jmp    tek41_next
  1919. tek41_int8:
  1920.     jmp    tek40_ex    ; PROGRAM ERROR !!!
  1921. ;
  1922. tek41_str:
  1923.     mov    cx,tek41_larg    ; check the room
  1924.     inc    cx
  1925.     cmp    cx,TEK41_ARGBUF_SIZE
  1926.     jae    tek41_str1    ; ae = room is full
  1927.     mov    bx,offset tek41_argbuf
  1928.     add    bx,tek41_larg
  1929.     mov    [bx],al
  1930.     inc    tek41_larg    ; update buffer length
  1931. tek41_str1:
  1932.     inc    tek41_nchr
  1933.     mov    cx,tek41_nchr
  1934.     cmp    cx,tek41_lstr
  1935.     jge    tek41_str2
  1936.     jmp    tek40_ex
  1937. tek41_str2:
  1938.     inc    tek41_nget
  1939.     jmp    tek41_next
  1940. ;
  1941. ; setup next argument for Tek41xx
  1942. ;
  1943. tek41_next:
  1944.     mov    cx,tek41_nget    ; number of arg. we have
  1945.     cmp    cx,tek41_narg    ; enough ?
  1946.     jl    tek41_next1    ; l=no, not.
  1947.     mov    tek41_nreq,TEK41_NO_ACT    ; yes, we have enough, no more.
  1948.     jmp    tek41_exec    ; execute the command.
  1949. tek41_next1:
  1950.     mov    bx,offset tek41_argt
  1951.     add    bx,cx
  1952.     mov    al,[bx]        ; argument type
  1953.     mov    tek41_nact,al    ; set next action
  1954.     cmp    al,TEK41_XY_TYPE
  1955.     jne    tek41_next2
  1956.     mov    tek41_nreq,TEK41_XY_TYPE    ; next data type is XY-type
  1957.     mov    tek_vseq,0    ; initialize vector format seq.
  1958.     jmp    tek40_ex
  1959. tek41_next2:
  1960.     cmp    al,TEK41_INT_TYPE
  1961.     jne    tek41_next3
  1962.     mov    tek41_nreq,TEK41_INT_TYPE    ; next data type is INT
  1963.     mov    tek41_ival,0
  1964.     jmp    tek40_ex
  1965. tek41_next3:
  1966.     cmp    al,TEK41_STR_TYPE
  1967.     jne    tek41_next4
  1968.     mov    tek41_nreq,TEK41_INT_TYPE    ; next data type is INT
  1969.     mov    tek41_ival,0
  1970.     mov    tek41_lstr,0
  1971.     mov    tek41_nchr,0
  1972.     jmp    tek40_ex
  1973. tek41_next4:
  1974.     cmp    al,TEK41_IAR_TYPE
  1975.     jne    tek41_next5
  1976.     mov    tek41_nreq,TEK41_INT_TYPE    ; next data type is INT
  1977.     mov    tek41_ival,0
  1978.     mov    tek41_liar,0
  1979.     mov    tek41_niar,0
  1980.     jmp    tek40_ex
  1981. tek41_next5:
  1982.     jmp    tek40_ex            ; PROGRAM ERROR !!!
  1983. ;
  1984. ; execute the Tek41 command
  1985. ;
  1986. tek41_exec:
  1987.     mov    bx,tek41_func
  1988.     jmp    bx
  1989. ;
  1990. tek41_exec_MC:
  1991.     mov    bx,offset tek41_argbuf
  1992.     mov    ax,[bx]            ; text width
  1993.     mov    tek_gtxt_w,ax
  1994.     mov    ax,[bx+2]        ; text height
  1995.     mov    tek_gtxt_h,ax
  1996.     mov    ax,[bx+4]        ; text spacing
  1997.     mov    tek_gtxt_s,ax
  1998.     call    set_gtxt_vect
  1999.     jmp    tek41_exec_done
  2000. ;
  2001. tek41_exec_ML:
  2002.     mov    ax,tek41_ival
  2003. ;@@    call    tek41_getcol    ; convert to tek41 color index
  2004.     mov    tek_lncol,ax
  2005.     jmp    tek41_exec_done
  2006. ;
  2007. tek41_exec_MT:
  2008.     mov    ax,tek41_ival
  2009. ;@@    call    tek41_getcol    ; convert to tek41 color index
  2010.     mov    tek_txcol,ax
  2011.     jmp    tek41_exec_done
  2012. ;
  2013. tek41_exec_MM:
  2014.     mov    ax,tek41_ival
  2015.     mov    marker_type,ax
  2016.     jmp    tek41_exec_done
  2017. ;
  2018. tek41_exec_MP:
  2019.     mov    ax,tek41_ival
  2020.     cmp    ax,0
  2021.     jg    tek41_exec_MP2
  2022.     je    tek41_exec_MP1
  2023.     neg    ax
  2024. ;@@    call    tek41_getcol    ; convert to tek41 color index
  2025. tek41_exec_MP1:
  2026.     mov    tek_facol,ax
  2027.     mov    tek_famod,0
  2028. tek41_exec_MP2:
  2029.     jmp    tek41_exec_done
  2030. ;
  2031. tek41_exec_MV:
  2032.     mov    ax,tek41_ival
  2033.     and    ax,07h
  2034.     mov    line_type,ax
  2035.     jmp    tek41_exec_done
  2036. ;
  2037. tek41_exec_MR:
  2038.     mov    bx,offset tek41_argbuf
  2039.     mov    ax,[bx]            ; rotation angle
  2040.     mov    cx,[bx+2]
  2041.     cmp    cx,0
  2042.     je    tek41_exec_MR_1
  2043.     jg    tek41_exec_MR_2
  2044.     neg    cx
  2045.     sar    ax,cl
  2046.     jmp    tek41_exec_MR_1
  2047. tek41_exec_MR_2:
  2048.     sal    ax,cl
  2049. tek41_exec_MR_1:
  2050.     cmp    ax,0
  2051.     jge    tek41_exec_MR_3
  2052.     add    ax,360
  2053.     jmp    tek41_exec_MR_1
  2054. tek41_exec_MR_3:
  2055.     cmp    ax,360
  2056.     jl    tek41_exec_MR_4
  2057.     sub    ax,360
  2058.     jmp    tek41_exec_MR_3
  2059. tek41_exec_MR_4:
  2060.     mov    tek_gtxt_ang,ax
  2061.     call    set_gtxt_vect
  2062.     jmp    tek41_exec_done
  2063. ;
  2064. tek41_exec_KA:
  2065.     mov    ax,tek41_ival
  2066.     mov    tek_dialog_area,al
  2067.     jmp    tek41_exec_done
  2068. ;
  2069. tek41_exec_LV:
  2070.     mov    ax,tek41_ival
  2071.     mov    tek_dialog_vsbl,al
  2072.     call    text_scrn
  2073.     jmp    tek41_exec_done
  2074. ;
  2075. tek41_exec_LZ:
  2076.     mov    si,offset vt_dialog_clr
  2077.     xor    cx,cx
  2078.     xor    ax,ax
  2079.     mov    cl,[si]
  2080.     inc    si
  2081.     stc
  2082.     ret
  2083. ;
  2084. tek41_exec_SETCOM:
  2085.     cmp    tek41_ival,0
  2086.     je    tek41_exec_nSETCOM
  2087.     mov    ah,1        ; change the mode to VT
  2088.     mov    al,0
  2089.     xor    cx,cx
  2090.     mov    tek41_cmd,0
  2091.     mov    tek_esc,0
  2092.     ret
  2093. tek41_exec_nSETCOM:
  2094. tek41_exec_unknown:
  2095.     mov    tek41_cmd,0    ; unknown command
  2096.     jmp    tek40_ex
  2097. ;
  2098. tek41_exec_none:
  2099.     mov    ax,tek41_cmd
  2100.     xchg    ah,al
  2101.     mov    tek_ignor_msg,ax
  2102.     jmp    tek41_exec_done
  2103. ;
  2104. tek41_exec_LG:
  2105.     cmp    tek_inpanel,0
  2106.     je    tek41_exec_LG1
  2107.     jmp    tek40_vct_fa
  2108. tek41_exec_LG1:
  2109.     mov    ax,line_type
  2110.     call    tek_ltyp
  2111.     mov    ax,tek_cur_x
  2112.     mov    bx,tek_cur_y
  2113.     call    tek40_dev_cood
  2114.     mov    pc98_x1,ax
  2115.     mov    pc98_y1,bx
  2116.     mov    ax,tek_req_x
  2117.     mov    bx,tek_req_y
  2118.     call    tek40_dev_cood
  2119.     call    tek_draw
  2120.     jmp    tek41_exec_LF1
  2121. tek41_exec_LH:
  2122.     cmp    tek_inpanel,0
  2123.     je    tek41_exec_LH1
  2124.     jmp    tek40_vct_fa
  2125. tek41_exec_LH1:
  2126.     mov    ax,tek_req_x
  2127.     mov    bx,tek_req_y
  2128.     call    tek40_dev_cood
  2129.     call    tek_mark
  2130.     jmp    tek41_exec_LF1
  2131. tek41_exec_LF:
  2132.     cmp    tek_inpanel,0
  2133.     je    tek41_exec_LF1
  2134.     jmp    tek40_vct_fa
  2135. tek41_exec_LF1:
  2136.     mov    ax,tek_req_x
  2137.     mov    tek_cur_x,ax
  2138.     mov    ax,tek_req_y
  2139.     mov    tek_cur_y,ax
  2140.     jmp    tek41_exec_done
  2141. ;
  2142. tek41_exec_LT:
  2143.     cmp    tek_inpanel,0
  2144.     je    tek41_exec_LT1
  2145.     jmp    tek40_ex
  2146. tek41_exec_LT1:
  2147.     mov    cx,tek41_nchr        ; get number of characters
  2148.     mov    si,offset tek41_argbuf
  2149.     add    si,2            ; 1st 2-bytes contains num of char
  2150.     call    tek_gtxt        ; draw graphic text
  2151.     jmp    tek41_exec_done
  2152. ;
  2153. ; Begin Panel Boundary
  2154. ;
  2155. tek41_exec_LP:
  2156.     mov    si,offset tek41_fabuf
  2157.     cmp    tek_inpanel,0        ; already in panel mode ?
  2158.     jne    tek41_exec_LP_c1    ; ne=Yes. Close the previous polygon
  2159.     jmp    tek41_exec_LP_1
  2160. tek41_exec_LP_c1:
  2161.     mov    ax,tek41_lfa
  2162.     add    si,ax
  2163.     mov    bx,tek41_faadr        ; get the address of the 1st point
  2164.     mov    ax,[bx+2]        ; get 1st X
  2165.     mov    [si],ax            ; add it to the last point
  2166.     mov    ax,[bx+4]        ; get 1st Y
  2167.     mov    [si+2],ax        ; add it to the last point
  2168.     add    tek41_lfa,4        ; update buffer length
  2169. ;
  2170.     cmp    tek_panel_bnd,0        ; draw boundary ?
  2171.     je    tek41_exec_LP_c2    ; e=no.
  2172.     mov    ax,[si]            ; get the 1st X
  2173.     mov    bx,[si+2]        ; get the 1st Y
  2174.     xchg    ax,pc98_x2
  2175.     xchg    bx,pc98_y2
  2176.     mov    pc98_x1,ax
  2177.     mov    pc98_y1,bx
  2178.     mov    ax,pc98_x2
  2179.     mov    bx,pc98_y2
  2180.     push    si            ; save buffer address
  2181.     call    tek_draw
  2182.     pop    si
  2183. tek41_exec_LP_c2:
  2184.     add    si,4            ; update buffer address
  2185.     jmp    tek41_exec_LP_2
  2186. tek41_exec_LP_1:
  2187.     mov    scan_xmin,639
  2188.     mov    scan_xmax,0
  2189.     mov    scan_ymin,399
  2190.     mov    scan_ymax,0
  2191.     mov    tek41_lfa,0
  2192. tek41_exec_LP_2:
  2193.     mov    tek41_faadr,si
  2194.     mov    ax,1            ; 1st point
  2195.     mov    [si],ax
  2196.     mov    ax,tek_req_x
  2197.     mov    bx,tek_req_y
  2198.     mov    tek_cur_x,ax
  2199.     mov    tek_cur_y,bx
  2200.     call    tek40_dev_cood
  2201.     mov    [si+2],ax
  2202.     mov    [si+4],bx
  2203.     mov    pc98_x2,ax
  2204.     mov    pc98_y2,bx
  2205.     cmp    ax,scan_xmin
  2206.     jge    tek41_exec_LP_3
  2207.     mov    scan_xmin,ax
  2208. tek41_exec_LP_3:
  2209.     cmp    ax,scan_xmax
  2210.     jle    tek41_exec_LP_4
  2211.     mov    scan_xmax,ax
  2212. tek41_exec_LP_4:
  2213.     cmp    bx,scan_ymin
  2214.     jge    tek41_exec_LP_5
  2215.     mov    scan_ymin,bx
  2216. tek41_exec_LP_5:
  2217.     cmp    bx,scan_ymax
  2218.     jle    tek41_exec_LP_6
  2219.     mov    scan_ymax,bx
  2220. tek41_exec_LP_6:
  2221.     add    tek41_lfa,6
  2222.     mov    tek_inpanel,1
  2223.     mov    ax,tek41_ival
  2224.     mov    tek_panel_bnd,al        ; set panel boundary mode
  2225.     test    al,1
  2226.     jz    tek41_exec_LP_ex
  2227.     mov    ax,line_type
  2228.     call    tek_ltyp
  2229. tek41_exec_LP_ex:
  2230.     jmp    tek41_exec_done
  2231. ;
  2232. tek41_exec_LE:
  2233.     mov    tek_inpanel,0
  2234. ;
  2235.     mov    si,offset tek41_fabuf
  2236.     mov    ax,tek41_lfa
  2237.     add    si,ax
  2238.     mov    bx,tek41_faadr
  2239.     mov    ax,[bx+2]        ; get 1st X
  2240.     mov    [si],ax            ; add it to the last point
  2241.     mov    ax,[bx+4]        ; get 1st Y
  2242.     mov    [si+2],ax        ; add it to the last point
  2243.     xor    ax,ax            ; terminator
  2244.     mov    [si+4],ax        ; set terminator
  2245.     add    tek41_lfa,6        ; update buffer length
  2246. ;
  2247.     cmp    tek_panel_bnd,0
  2248.     je    tek41_exec_LE6
  2249.     mov    ax,[si]
  2250.     mov    bx,[si+2]
  2251.     xchg    ax,pc98_x2
  2252.     xchg    bx,pc98_y2
  2253.     mov    pc98_x1,ax
  2254.     mov    pc98_y1,bx
  2255.     mov    ax,pc98_x2
  2256.     mov    bx,pc98_y2
  2257.     call    tek_draw
  2258. ;
  2259. tek41_exec_LE6:
  2260.     mov    si,offset tek41_fabuf
  2261.     call    tek_fill
  2262. tek41_exec_LE_ex:
  2263.     jmp    tek41_exec_done
  2264. ;
  2265. tek41_exec_RW:
  2266.     push    ax
  2267.     push    bx
  2268. ;
  2269. ; Check the variables
  2270. ;
  2271.     mov    si,offset tek41_argbuf
  2272.     mov    ax,[si]            ; x1
  2273.     mov    bx,[si+4]        ; x2
  2274.     cmp    ax,bx
  2275.     jl    tek41_exec_RW1
  2276.     jmp    tek41_exec_RW_ERR
  2277. tek41_exec_RW1:
  2278.     mov    ax,[si+2]        ; y1
  2279.     mov    bx,[si+6]        ; y2
  2280.     cmp    ax,bx
  2281.     jl    tek41_exec_RW2
  2282.     jmp    tek41_exec_RW_ERR
  2283. tek41_exec_RW2:
  2284. ;
  2285. ; Check OK. Do it.
  2286. ;
  2287.     mov    ax,[si]
  2288.     mov    tek_wnx1,ax
  2289.     mov    ax,[si+2]
  2290.     mov    tek_wny1,ax
  2291.     mov    ax,[si+4]
  2292.     mov    tek_wnx2,ax
  2293.     mov    ax,[si+6]
  2294.     mov    tek_wny2,ax
  2295. ;
  2296.     push    si
  2297.     push    di
  2298.     mov    si,offset tek_wnx1
  2299.     mov    di,offset tek_w2v_mat
  2300.     call    set_tek41_mat        ; set the transformation matrix
  2301.     pop    di
  2302.     pop    si
  2303.     jmp    tek41_exec_RW_ex
  2304. ;
  2305. tek41_exec_RW_ERR:
  2306. tek41_exec_RW_ex:
  2307.     pop    bx
  2308.     pop    ax
  2309.     jmp    tek41_exec_done
  2310. ;
  2311. tek41_exec_TM:
  2312.     push    bx
  2313.     mov    bx,offset tek41_argbuf
  2314.     mov    ax,[bx]
  2315.     cmp    ax,0
  2316.     je    tek41_exec_TM1
  2317.     mov    tek_cmode_1,al
  2318. tek41_exec_TM1:
  2319.     add    bx,2
  2320.     mov    ax,[bx]
  2321.     cmp    ax,0
  2322.     je    tek41_exec_TM2
  2323.     mov    tek_cmode_2,al
  2324. tek41_exec_TM2:
  2325.     add    bx,2
  2326.     mov    ax,[bx]
  2327.     cmp    ax,0
  2328.     je    tek41_exec_TM3
  2329.     mov    tek_cmode_3,al
  2330. tek41_exec_TM3:
  2331.     pop    bx
  2332.     jmp    tek41_exec_done
  2333. ;
  2334. tek41_exec_TG:
  2335.     push    si
  2336.     mov    si,offset tek41_argbuf
  2337.     mov    ax,[si]            ; ignore surface number
  2338. tek41_exec_TG1:
  2339.     mov    ax,[si+2]        ; array size
  2340.     cmp    ax,4            ; must be multiple of 4
  2341.     jge    tek41_exec_TG2
  2342.     jmp    tek41_exec_TG_ex
  2343. tek41_exec_TG2:
  2344.     shr    ax,1
  2345.     shr    ax,1            ; number of colors
  2346.     mov    cx,ax
  2347.     add    si,4
  2348. tek41_exec_TG_L1:
  2349.     cmp    cx,0
  2350.     jg    tek41_exec_TG_L2
  2351.     jmp    tek41_exec_TG_do
  2352. tek41_exec_TG_L2:
  2353.     mov    ax,[si]            ; get index
  2354.     cmp    ax,0
  2355.     jge    tek41_exec_TG3
  2356.     jmp    tek41_exec_TG_nx
  2357. tek41_exec_TG3:
  2358.     cmp    ax,15
  2359.     jle    tek41_exec_TG4
  2360.     jmp    tek41_exec_TG_nx
  2361. tek41_exec_TG4:
  2362.     cmp    tek_cmode_1,1        ; RGB [0-100] mode ?
  2363.     jne    tek41_exec_TG5
  2364.     jmp    tek41_exec_TG_RGB1
  2365. tek41_exec_TG5:
  2366.     cmp    tek_cmode_1,2        ; CMY [0-100] mode ?
  2367.     jne    tek41_exec_TG6
  2368.     jmp    tek41_exec_TG_CMY
  2369. tek41_exec_TG6:
  2370.     cmp    tek_cmode_1,3        ; HLS mode ?
  2371.     jne    tek41_exec_TG7
  2372.     jmp    tek41_exec_TG_HLS
  2373. tek41_exec_TG7:
  2374.     cmp    tek_cmode_1,4        ; RGB [0-255] mode ?
  2375.     jne    tek41_exec_TG8
  2376.     jmp    tek41_exec_TG_RGB2
  2377. tek41_exec_TG8:
  2378.     jmp    tek41_exec_TG_ex    ; other cases are not supported yet.
  2379. tek41_exec_TG_HLS:
  2380.     push    si
  2381.     add    si,2
  2382.     call    HLS_to_RGB
  2383.     pop    si
  2384.     jmp    tek41_exec_TG_RGB1
  2385. tek41_exec_TG_CMY:
  2386.     push    bx
  2387.     mov    ax,100
  2388.     mov    bx,[si+2]
  2389.     sub    ax,bx
  2390.     mov    [si+2],ax
  2391.     mov    ax,100
  2392.     mov    bx,[si+4]
  2393.     sub    ax,bx
  2394.     mov    [si+4],ax
  2395.     mov    ax,100
  2396.     mov    bx,[si+6]
  2397.     sub    ax,bx
  2398.     mov    [si+6],ax
  2399.     pop    bx
  2400. tek41_exec_TG_RGB1:
  2401.     push    si
  2402.     add    si,2
  2403.     call    RGB100_to_255
  2404.     pop    si
  2405. tek41_exec_TG_RGB2:
  2406.     push    bx
  2407.     mov    bx,offset tek_col
  2408.     mov    ax,[si]            ; get index
  2409.     add    bx,ax
  2410.     add    bx,ax
  2411.     add    bx,ax
  2412.     mov    ax,[si+2]
  2413.     mov    [bx],al
  2414.     mov    ax,[si+4]
  2415.     mov    [bx+1],al
  2416.     mov    ax,[si+6]
  2417.     mov    [bx+2],al
  2418.     pop    bx
  2419. tek41_exec_TG_nx:
  2420.     dec    cx
  2421.     add    si,8            ; 4 integers are processed.
  2422.     jmp    tek41_exec_TG_L1
  2423. tek41_exec_TG_do:
  2424.     mov    si,offset tek_col
  2425.     call    set_gpalette
  2426. tek41_exec_TG_ex:
  2427.     pop    si
  2428. ;
  2429. tek41_exec_done:
  2430.     mov    tek41_cmd,0
  2431.     mov    tek_esc,0
  2432.     jmp    tek40_ex
  2433. ;
  2434. tek40_vtchg:
  2435.     cmp    tek_P_prv,'?'
  2436.     jne    tek40_vtchg_ex
  2437.     cmp    tek_P_buf,38
  2438.     jne    tek40_vtchg_ex
  2439.     mov    ah,1
  2440.     mov    al,0
  2441.     mov    cx,0
  2442.     clc
  2443.     ret
  2444. tek40_vtchg_ex:
  2445.     jmp    tek40_esc_ex
  2446.  
  2447. ;  Alpha mode: If printable character, then put the character at
  2448. ;  current position.
  2449. ;---------
  2450. tek40_alp:
  2451. ;---------
  2452.     and    al,07Fh
  2453.     cmp    al,' '        ; C0 character ?
  2454.     jae    tek40_alp_01    ; ae=no.
  2455.     jmp    tek40_C0
  2456. tek40_alp_01:
  2457.     cmp    tek_dialog_area,0    ; dialog on graphic screen ?
  2458.     je    tek40_alp_02    ; e = yes.
  2459.     mov    si,offset vt_buf
  2460.     mov    [si],al
  2461.     mov    cx,1
  2462.     stc            ; set carry to pass the char. to VT
  2463.     ret
  2464. tek40_alp_02:
  2465.     sub    al,' '
  2466.     xor    ah,ah
  2467.     shl    ax,1
  2468.     shl    ax,1
  2469.     shl    ax,1
  2470.     mov    si,offset gfont88
  2471.     add    si,ax
  2472.     mov    di,offset ggdc_buff
  2473.     mov    byte ptr [di],078h    ; TEXTW
  2474.     mov    byte ptr [di+1],8    ; number of parameters
  2475.     add    di,2
  2476.     cld
  2477.     mov    cx,8
  2478.     push    es
  2479.     push    ds
  2480.     pop    es
  2481.     rep    movsb
  2482.     pop    es
  2483. ;    add    di,8
  2484.     mov    ax,tek_cur_x
  2485.     mov    bx,tek_cur_y
  2486.     call    tek40_dev_cood
  2487.     push    di
  2488. ;@@    mov    cx,GGDC_GREEN_PLANE    ; cursor graphic plane
  2489.     xor    cx,cx
  2490.     call    gcsrw
  2491.     mov    byte ptr [di],20h
  2492.     mov    byte ptr [di+1],0
  2493.     add    di,2
  2494.     mov    byte ptr [di],04Ch    ; VEXTW
  2495.     mov    byte ptr [di+1],3    ; number of parameters
  2496.     mov    byte ptr [di+2],012h    ; normal text dir=2
  2497.     mov    byte ptr [di+3],07h
  2498.     mov    byte ptr [di+4],0
  2499.     mov    byte ptr [di+5],068h    ; TEXTE
  2500.     mov    byte ptr [di+6],0
  2501.     mov    byte ptr [di+7],0FFh    ; terminator
  2502.     mov    si,offset ggdc_buff
  2503. ;@@    call    send_to_GGDC
  2504.     mov    ax,tek_txcol        ; set text color
  2505.     pop    di
  2506.     call    GGDC_color
  2507.     mov    ax,TEK_DX
  2508.     add    tek_cur_x,ax
  2509.     jmp    tek40_ex
  2510. ;--------
  2511. tek40_C0:
  2512. ;--------
  2513.     cmp    al,ESCAPE        ; need to handle in this module?
  2514.     jl    tek40_C01        ; l=no. May go to vt
  2515.     jmp    tek40_C02
  2516. tek40_C01:
  2517.     cmp    tek_dialog_area,0    ; dialog on graphics ?
  2518.     je    tek40_C01_1        ; e=yes.
  2519.     mov    tek_esc,0
  2520.     mov    tek_mod,0
  2521.     mov    si,offset vt_buf
  2522.     mov    [si],al
  2523.     mov    cx,1
  2524.     stc                ; set carry to pass AL to VT
  2525.     ret
  2526. tek40_C01_1:
  2527.     mov    tek_esc,0
  2528.     mov    tek_mod,0
  2529.     cmp    al,BELL
  2530.     jne    tek40_n07
  2531.     call    pc98_bell
  2532.     jmp    tek40_ex
  2533. tek40_n07:
  2534.     cmp    al,BS
  2535.     jne    tek40_n08
  2536.     sub    tek_cur_x,TEK_DX
  2537.     cmp    tek_cur_x,0
  2538.     jge    tek40_08_01
  2539.     mov    tek_cur_x,0
  2540. tek40_08_01:
  2541.     mov    tek_esc,0
  2542.     jmp    tek40_ex
  2543. tek40_n08:
  2544. ;
  2545.     cmp    al,HT
  2546.     jne    tek40_n09
  2547.     add    tek_cur_x,TEK_DX
  2548.     cmp    tek_cur_x,TEK_X_MAX
  2549.     jle    tek40_09_01
  2550.     mov    tek_cur_x,TEK_X_MAX
  2551. tek40_09_01:
  2552.     mov    tek_esc,0
  2553.     jmp    tek40_ex
  2554. tek40_n09:
  2555. ;
  2556.     cmp    al,LF
  2557.     jne    tek40_n0A
  2558.     sub    tek_cur_y,TEK_DY
  2559.     cmp    tek_cur_y,0
  2560.     jge    tek40_0A_01
  2561.     mov    tek_cur_y,TEK_Y_MAX
  2562.     sub    tek_cur_y,TEK_DY
  2563. tek40_0A_01:
  2564.     mov    tek_esc,0            ; ESC seq done
  2565.     jmp    tek40_ex
  2566. tek40_n0A:
  2567. ;
  2568.     cmp    al,VT
  2569.     jne    tek40_n0B
  2570.     jmp    tek40_ex
  2571. tek40_n0B:
  2572.     cmp    al,CR
  2573.     jne    tek40_n0D
  2574.     mov    tek_cur_x,0
  2575.     mov    tek_mod,0            ; enter alpha mode
  2576.     mov    tek_esc,0            ; ESC seq done
  2577.     jmp    tek40_ex
  2578. tek40_n0D:
  2579. ;
  2580.     cmp    al,CL_CAN
  2581.     jne    tek40_n18
  2582.     mov    tek_mod,0
  2583.     mov    tek_esc,0
  2584. ;
  2585. ; Leave tektronix mode if tek4010 enabled
  2586. ;
  2587.     test    vt100_flags,AUTOTEK_BIT
  2588.     jz    tek40_18_01
  2589.     mov    ah,1            ; pass no character
  2590.     mov    al,0
  2591.     mov    cx,0
  2592.     clc
  2593.     ret
  2594. tek40_18_01:
  2595.     jmp    tek40_ex
  2596. tek40_n18:
  2597. ;
  2598. ; ESC, FS, GS, RS, US must be analyzed in TeK module
  2599. ;
  2600. tek40_C02:
  2601.     cmp    al,ESCAPE
  2602.     jne    tek40_n1B
  2603.     mov    tek_esc,1            ; initiate ESC sequence
  2604.     jmp    tek40_ex
  2605. tek40_n1B:
  2606. ;
  2607.     cmp    al,FS
  2608.     jne    tek40_n1C
  2609.     mov    tek_mod,2            ; enter point plot mode
  2610.     mov    tek_vseq,0            ; reset xy order sequence
  2611.     mov    di,offset ggdc_buff
  2612.     mov    byte ptr [di],078h        ; TEXTW command
  2613.     mov    byte ptr [di+1],2        ; number of parameters
  2614.     mov    word ptr [di+2],0FFFFh        ; set line type to solid
  2615.     mov    byte ptr [di+4],0FFh        ; terminator
  2616.     mov    si,offset ggdc_buff
  2617.     call    send_to_GGDC
  2618.     mov    tek_esc,0            ; ESC seq done
  2619.     jmp    tek40_ex
  2620. tek40_n1C:
  2621. ;
  2622.     cmp    al,GS
  2623.     jne    tek40_n1D
  2624.     mov    tek_mod,1            ; enter graph mode
  2625.     mov    tek_npnt,0            ; reset number of points
  2626.     mov    tek_vseq,0
  2627.     mov    ax,line_type
  2628.     call    tek_ltyp
  2629.     mov    tek_esc,0            ; ESC seq done
  2630.     jmp    tek40_ex
  2631. tek40_n1D:
  2632. ;
  2633.     cmp    al,RS
  2634.     jne    tek40_n1E
  2635.     mov    tek_mod,3            ; enter incremental plot mode
  2636.     mov    tek_pen,0            ; reset pen state
  2637.     mov    di,offset ggdc_buff
  2638.     mov    byte ptr [di],078h        ; TEXTW command
  2639.     mov    byte ptr [di+1],2        ; number of parameters
  2640.     mov    word ptr [di+2],0FFFFh        ; set line type to solid
  2641.     mov    byte ptr [di+4],0FFh        ; terminator
  2642.     mov    si,offset ggdc_buff
  2643.     call    send_to_GGDC
  2644.     mov    tek_esc,0            ; ESC seq done
  2645.     jmp    tek40_ex
  2646. tek40_n1E:
  2647. ;
  2648.     cmp    al,US
  2649.     jne    tek40_n1F
  2650.     mov    tek_mod,0            ; enter alpha mode
  2651.     mov    line_type,0
  2652.     mov    tek_esc,0            ; ESC seq done
  2653.     jmp    tek40_ex
  2654. tek40_n1F:
  2655.     mov    tek_esc,0        ; Unknonw C0 character
  2656.     jmp    tek40_ex
  2657.  
  2658. ;---------
  2659. tek40_vct:
  2660. ;---------
  2661.     and    al,07Fh            ; Mask 8th bit
  2662.     cmp    al,' '            ; Control character ?
  2663.     jae    tek40_vct_01        ; ae = No.
  2664.     cmp    al,ESCAPE
  2665.     jae    tek40_vct_C0
  2666.     cmp    al,CR
  2667.     jne    tek40_vct_n0D
  2668.     cmp    tek_dialog_area,0    ; disable dialog ?
  2669.     je    tek40_vct_C0        ; e=yes.
  2670. tek40_vct_n0D:
  2671.     jmp    tek40_ex        ; any other C0 characters are ignored.
  2672. tek40_vct_C0:
  2673.     jmp    tek40_C0        ; Yes. control character.
  2674. tek40_vct_01:
  2675.     mov    ah,al
  2676.     and    ah,060h
  2677.     and    al,01Fh
  2678. ;
  2679.     cmp    tek_vseq,0
  2680.     jne    tek40_vct_02
  2681. tek40_vct_HIY:
  2682.     cmp    ah,HIY            ; HIY data ?
  2683.     jne    tek40_vct_EXT
  2684.     mov    tek_cur_HIY,al        ; Yes. Fill HIY
  2685.     mov    tek_vseq,1        ; Next is EXT
  2686.     jmp    tek40_vct_end
  2687. tek40_vct_02:
  2688.     cmp    tek_vseq,1        ; EXT order?
  2689.     jne    tek40_vct_03
  2690. tek40_vct_EXT:
  2691.     cmp    ah,EXT            ; EXT data ?
  2692.     jne    tek40_vct_LOY
  2693.     mov    tek_cur_LOY,al        ; Yes. Temporary store to LOY
  2694.     mov    tek_vseq,2        ; Next is LOY
  2695.     jmp    tek40_vct_end
  2696. tek40_vct_03:
  2697.     cmp    tek_vseq,2        ; LOY order ?
  2698.     jne    tek40_vct_04
  2699. tek40_vct_LOY:
  2700.     cmp    ah,LOY            ; LOY data ?
  2701.     jne    tek40_vct_HIX
  2702.     mov    ah,tek_cur_LOY        ; Yes. LOY/EXT appears twice.
  2703.     mov    tek_cur_EXT,ah        ; Previous is EXT and current is LOY
  2704.     mov    tek_cur_LOY,al
  2705.     mov    tek_vseq,3        ; Next is HIX
  2706.     jmp    tek40_vct_end
  2707. tek40_vct_04:
  2708.     cmp    tek_vseq,3        ; HIX order ?
  2709.     jne    tek40_vct_05
  2710. tek40_vct_HIX:
  2711.     cmp    ah,HIX            ; HIX data ?
  2712.     jne    tek40_vct_LOX        ; No. Test LOX data
  2713.     mov    tek_cur_HIX,al        ; Yes. Set HIX
  2714.     mov    tek_vseq,4        ; Next is LOX
  2715.     jmp    tek40_vct_end
  2716. tek40_vct_05:
  2717.     cmp    tek_vseq,4        ; LOX order ?
  2718.     jne    tek40_vct_ERR
  2719. tek40_vct_LOX:
  2720.     cmp    ah,LOX            ; LOX data ?
  2721.     jne    tek40_vct_ERR        ; No. This is error
  2722.     mov    tek_cur_LOX,al        ; Yes. Set LOX
  2723.     mov    tek_vseq,0        ; GS seq done
  2724.     jmp    tek40_get_xy
  2725. tek40_vct_ERR:
  2726.     call    pc98_bell
  2727.     mov    tek_vseq,0
  2728.     mov    tek_npnt,0
  2729.     cmp    tek_esc,4        ; in Tek41 command ?
  2730.     jne    tek40_vct_ERR1        ; ne = no.
  2731.     mov    tek_req_x,0
  2732.     mov    tek_req_y,0
  2733.     jmp    tek41_xy1
  2734. tek40_vct_ERR1:
  2735.     jmp    tek40_vct_end
  2736. ;
  2737. ;  Convert TEK xy representation to the binary (x,y)
  2738. ;
  2739. tek40_get_xy:
  2740.     mov    al,tek_cur_HIY        ; get HIY
  2741.     xor    ah,ah            ; clear higher byte
  2742.     mov    cl,5            ; number of shifts
  2743.     shl    ax,cl            ; HIY done
  2744.     or    al,tek_cur_LOY        ; add LOY
  2745.     shl    ax,1
  2746.     shl    ax,1
  2747.     mov    bl,tek_cur_EXT        ; get EXT
  2748.     shr    bl,1
  2749.     shr    bl,1
  2750.     and    bl,3            ; Lower 2 bits have meaning
  2751.     or    al,bl            ; all done.
  2752.     mov    tek_req_y,ax        ; set requested y
  2753. ;
  2754.     mov    al,tek_cur_HIX        ; get HIX
  2755.     xor    ah,ah            ; clear higher byte
  2756.     mov    cl,5            ; number of shifts
  2757.     shl    ax,cl            ; HIX is set
  2758.     or    al,tek_cur_LOX        ; add LOX
  2759.     shl    ax,1
  2760.     shl    ax,1
  2761.     mov    bl,tek_cur_EXT        ; get EXT
  2762.     and    bl,3            ; Only lower 2 bits have meaning
  2763.     or    al,bl            ; all done.
  2764.     mov    tek_req_x,ax        ; set requested x
  2765. ;
  2766.     cmp    tek_esc,4        ; in TeK41 command ?
  2767.     jne    tek40_get_xy1        ; ne = no.
  2768.     jmp    tek41_xy1
  2769. tek40_get_xy1:
  2770.     cmp    tek_inpanel,0        ; in Panel mode ?
  2771.     je    tek40_get_xy2        ; e = no.
  2772.     jmp    tek40_vct_fa
  2773. tek40_get_xy2:
  2774. ;
  2775.     cmp    tek_mod,1
  2776.     je    tek40_vec_ln
  2777.     jmp    tek40_vct_pt
  2778. tek40_vec_ln:
  2779.     cmp    tek_npnt,0
  2780.     jne    tek40_vct_ln01
  2781.     mov    tek_npnt,1
  2782.     jmp    tek40_vct_do1
  2783. ;
  2784. tek40_vct_ln01:
  2785. ;
  2786. ;    Not the first point. Draw line.
  2787. ;
  2788.     mov    ax,tek_cur_x
  2789.     mov    bx,tek_cur_y
  2790.     call    tek40_dev_cood
  2791.     mov    pc98_x1,ax
  2792.     mov    pc98_y1,bx
  2793.     mov    ax,tek_req_x
  2794.     mov    bx,tek_req_y
  2795.     call    tek40_dev_cood
  2796.     mov    pc98_x2,ax
  2797.     mov    pc98_y2,bx
  2798.     call    tek_draw
  2799.     jmp    tek40_vct_do1
  2800. ;
  2801. ; Point plot mode
  2802. ;
  2803. tek40_vct_pt:
  2804.     mov    ax,tek_req_x
  2805.     mov    bx,tek_req_y
  2806.     call    tek40_dev_cood
  2807.     call    tek_mark
  2808. ;
  2809. tek40_vct_do:
  2810.     mov    di,si
  2811. ;@@    call    send_to_GGDC
  2812.     call    GGDC_color
  2813. tek40_vct_do1:
  2814.     mov    ax,tek_req_x
  2815.     mov    tek_cur_x,ax
  2816.     mov    ax,tek_req_y
  2817.     mov    tek_cur_y,ax
  2818.     jmp    tek40_vct_end
  2819. ;
  2820. tek40_vct_fa:
  2821.     mov    ax,tek_req_x
  2822.     mov    bx,tek_req_y
  2823.     call    tek40_dev_cood
  2824.     mov    cx,tek41_lfa
  2825.     add    cx,10            ; requested length
  2826.     cmp    cx,TEK41_FABUF_SIZE    ; have enough room ?
  2827.     jbe    tek40_vct_fa1        ; be=yes
  2828.     jmp    tek40_vct_fa2
  2829. tek40_vct_fa1:
  2830.     push    si
  2831.     mov    si,offset tek41_fabuf
  2832.     add    si,tek41_lfa
  2833.     mov    [si],ax
  2834.     mov    [si+2],bx
  2835.     add    tek41_lfa,4
  2836.     mov    si,tek41_faadr
  2837.     mov    cx,[si]
  2838.     inc    cx
  2839.     mov    [si],cx            ; increment number of points
  2840.     pop    si
  2841.     cmp    ax,scan_xmin
  2842.     jge    tek40_vct_fa1_1
  2843.     mov    scan_xmin,ax
  2844. tek40_vct_fa1_1:
  2845.     cmp    ax,scan_xmax
  2846.     jle    tek40_vct_fa1_2
  2847.     mov    scan_xmax,ax
  2848. tek40_vct_fa1_2:
  2849.     cmp    bx,scan_ymin
  2850.     jge    tek40_vct_fa1_3
  2851.     mov    scan_ymin,bx
  2852. tek40_vct_fa1_3:
  2853.     cmp    bx,scan_ymax
  2854.     jle    tek40_vct_fa1_4
  2855.     mov    scan_ymax,bx
  2856. tek40_vct_fa1_4:
  2857. tek40_vct_fa2:
  2858.     cmp    tek_panel_bnd,0
  2859.     je    tek40_vct_end
  2860.     xchg    ax,pc98_x2
  2861.     xchg    bx,pc98_y2
  2862.     mov    pc98_x1,ax
  2863.     mov    pc98_y1,bx
  2864.     mov    ax,pc98_x2
  2865.     mov    bx,pc98_y2
  2866.     call    tek_draw
  2867. tek40_vct_end:
  2868.     jmp    tek40_ex
  2869. ;
  2870. ; Incremental Plot
  2871. ;
  2872. tek40_inc:
  2873.     and    al,07Fh            ; mask 8th bit
  2874.     cmp    al,'A'            ; move to right?
  2875.     jne    tek40_inc_NA        ; ne = no
  2876.     inc    tek_cur_x
  2877.     jmp    tek40_inc_do
  2878. tek40_inc_NA:
  2879.     cmp    al,'B'            ; move to left?
  2880.     jne    tek40_inc_NB        ; ne = no.
  2881.     dec    tek_cur_x
  2882.     jmp    tek40_inc_do
  2883. tek40_inc_NB:
  2884.     cmp    al,'D'            ; move to up?
  2885.     jne    tek40_inc_ND        ; ne = no.
  2886.     inc    tek_cur_y
  2887.     jmp    tek40_inc_do
  2888. tek40_inc_ND:
  2889.     cmp    al,'H'            ; move to down?
  2890.     jne    tek40_inc_NH        ; ne = no.
  2891.     dec    tek_cur_y
  2892.     jmp    tek40_inc_do
  2893. tek40_inc_NH:
  2894.     cmp    al,'E'            ; move to right up
  2895.     jne    tek40_inc_NE
  2896.     inc    tek_cur_x
  2897.     inc    tek_cur_y
  2898.     jmp    tek40_inc_do
  2899. tek40_inc_NE:
  2900.     cmp    al,'J'
  2901.     jne    tek40_inc_NJ
  2902.     dec    tek_cur_x
  2903.     dec    tek_cur_y
  2904.     jmp    tek40_inc_do
  2905. tek40_inc_NJ:
  2906.     cmp    al,'F'
  2907.     jne    tek40_inc_NF
  2908.     dec    tek_cur_x
  2909.     inc    tek_cur_y
  2910.     jmp    tek40_inc_do
  2911. tek40_inc_NF:
  2912.     cmp    al,'I'
  2913.     jne    tek40_inc_NI
  2914.     inc    tek_cur_x
  2915.     dec    tek_cur_y
  2916.     jmp    tek40_inc_do
  2917. tek40_inc_NI:
  2918.     cmp    al,' '
  2919.     jne    tek40_inc_NS
  2920.     mov    tek_pen,0
  2921.     jmp    tek40_ex
  2922. tek40_inc_NS:
  2923.     cmp    al,'P'
  2924.     jne    tek40_inc_NP
  2925.     mov    tek_pen,1
  2926.     jmp    tek40_ex
  2927. tek40_inc_NP:
  2928.     mov    tek_mod,0        ; Enter alpha mode
  2929.     jmp    tek40_00
  2930. tek40_inc_do:
  2931.     cmp    tek_pen,0
  2932.     jne    tek40_inc_do1
  2933.     jmp    tek40_ex
  2934. tek40_inc_do1:
  2935.     mov    di,offset ggdc_buff
  2936.     mov    ax,tek_cur_x
  2937.     mov    bx,tek_cur_y
  2938.     call    tek40_dev_cood
  2939. ;@@    mov    cx,GGDC_GREEN_PLANE
  2940.     xor    cx,cx
  2941.     call    gcsrw
  2942.     mov    byte ptr [di],20h
  2943.     mov    byte ptr [di+1],0
  2944.     add    di,2
  2945. ;
  2946.     mov     byte ptr [di],4ch        ; VECTW command
  2947.     mov    byte ptr [di+1],9        ; number of parameters
  2948. ;
  2949.     mov    byte ptr [di+2],0        ; dir
  2950.     mov    word ptr [di+3],0        ; abs(d_x)
  2951.     mov    word ptr [di+5],0        ; 2*abs(d_y)-abs(d_x)
  2952.     mov    word ptr [di+7],0        ; 2*abs(d_y)-2*abs(d_x)
  2953.     mov    word ptr [di+9],0        ; 2*abs(d_y)
  2954. ;
  2955.     mov    byte ptr [di+11],6ch        ; VECTE command
  2956.     mov    byte ptr [di+12],0        ; with no parameters
  2957.     add    di,13                ; update address
  2958. ;
  2959.     mov    byte ptr [di],0FFh        ; set terminator
  2960.     mov    si,offset ggdc_buff
  2961.     mov    ax,tek_lncol            ; set line color
  2962. ;
  2963.     mov    di,si
  2964. ;@@    call    send_to_GGDC
  2965.     call    GGDC_color
  2966.     jmp    tek40_ex
  2967. ;
  2968. TEK4014    ENDP
  2969. ;
  2970. tek_ltyp    proc    near
  2971. ;
  2972. ; Set line type in AX
  2973. ;
  2974.     shl    ax,1
  2975.     mov    si,offset line_type_table
  2976.     add    si,ax
  2977.     mov    ax,[si]
  2978.     mov    di,offset ggdc_buff
  2979.     mov    byte ptr [di],078h    ; TEXTW command
  2980.     mov    byte ptr [di+1],2    ; number of parameters
  2981.     mov    word ptr [di+2],ax    ; line type
  2982.     mov    byte ptr [di+4],0FFh    ; terminator
  2983.     mov    si,offset ggdc_buff
  2984.     call    send_to_GGDC
  2985.     ret
  2986. tek_ltyp    endp
  2987. ;
  2988. tek_draw    proc    near
  2989. ;
  2990. ; Draw line between from (pc98_x1,pc98_y1) to (ax,bx)
  2991. ;
  2992.     push    ax
  2993.     push    bx
  2994.     mov    di,offset ggdc_buff
  2995.     mov    ax,pc98_x1
  2996.     mov    bx,pc98_y1
  2997.     xor    cx,cx
  2998.     call    gcsrw
  2999.     mov    byte ptr [di],20h
  3000.     mov    byte ptr [di+1],0
  3001.     add    di,2
  3002.     pop    bx
  3003.     pop    ax
  3004.     sub    ax,pc98_x1
  3005.     sub    bx,pc98_y1
  3006.     call    gline
  3007.     mov    byte ptr [di],0FFh
  3008.     mov    si,offset ggdc_buff
  3009.     mov    ax,tek_lncol
  3010.     mov    di,si
  3011.     call    GGDC_color
  3012.     ret
  3013. tek_draw    endp
  3014. ;
  3015. tek_mark    proc    near
  3016. ;
  3017. ;  Put marker at (ax,bx) given in device coordinate
  3018. ;
  3019.     cmp    marker_type,0        ; marker type 0 ?
  3020.     je    tek_mark_0        ; e=yes
  3021.     jmp    tek_mark_n0
  3022. tek_mark_0:
  3023.     xor    cx,cx
  3024.     call    gcsrw
  3025.     mov    byte ptr [di],20h
  3026.     mov    byte ptr [di+1],0
  3027.     add    di,2
  3028. ;
  3029.     mov     byte ptr [di],4ch        ; VECTW command
  3030.     mov    byte ptr [di+1],9        ; number of parameters
  3031. ;
  3032.     mov    byte ptr [di+2],0        ; dir
  3033.     mov    word ptr [di+3],0        ; abs(d_x)
  3034.     mov    word ptr [di+5],0        ; 2*abs(d_y)-abs(d_x)
  3035.     mov    word ptr [di+7],0        ; 2*abs(d_y)-2*abs(d_x)
  3036.     mov    word ptr [di+9],0        ; 2*abs(d_y)
  3037. ;
  3038.     mov    byte ptr [di+11],6ch        ; VECTE command
  3039.     mov    byte ptr [di+12],0        ; with no parameters
  3040.     add    di,13                ; update address
  3041. ;
  3042.     mov    byte ptr [di],0FFh        ; set terminator
  3043.     mov    si,offset ggdc_buff
  3044.     mov    ax,tek_lncol            ; set line color
  3045.     mov    di,si
  3046.     jmp    tek_mark_do
  3047. tek_mark_n0:
  3048.     push    ax
  3049.     push    bx
  3050.     mov    ax,marker_type
  3051.     xor    ah,ah
  3052.     shl    ax,1
  3053.     shl    ax,1
  3054.     shl    ax,1
  3055.     mov    si,offset gmark88
  3056.     add    si,ax
  3057.     mov    di,offset ggdc_buff
  3058.     mov    byte ptr [di],078h    ; TEXTW
  3059.     mov    byte ptr [di+1],8    ; number of parameters
  3060.     add    di,2
  3061.     cld
  3062.     mov    cx,8
  3063.     push    es
  3064.     push    ds
  3065.     pop    es
  3066.     rep    movsb
  3067.     pop    es
  3068. ;@@    add    di,8
  3069.     mov    byte ptr [di],0ffh    ; set terminator
  3070.     mov    si,offset ggdc_buff
  3071.     call    send_to_GGDC
  3072.     pop    bx
  3073.     pop    ax            ; remember x position
  3074.     add    ax,mark_dx
  3075.     add    bx,mark_dy
  3076.     mov    di,offset ggdc_buff
  3077.     xor    cx,cx
  3078.     call    gcsrw
  3079.     mov    byte ptr [di],20h
  3080.     mov    byte ptr [di+1],0
  3081.     add    di,2
  3082.     mov    byte ptr [di],04Ch    ; VECTW
  3083.     mov    byte ptr [di+1],3    ; number of parameters
  3084.     mov    byte ptr [di+2],012h    ; normal text dir=2
  3085.     mov    byte ptr [di+3],07h
  3086.     mov    byte ptr [di+4],0
  3087.     mov    byte ptr [di+5],068h    ; TEXTE
  3088.     mov    byte ptr [di+6],0
  3089.     mov    byte ptr [di+7],0FFh    ; terminator
  3090.     mov    di,offset ggdc_buff
  3091.     mov    si,di
  3092.     mov    ax,tek_lncol        ; set marker color
  3093. tek_mark_do:
  3094.     call    GGDC_color
  3095.     ret
  3096. tek_mark    endp
  3097. ;
  3098. tek_gtxt    proc    near
  3099. ;
  3100. ; Write Graphic Text
  3101. ;    cx    number of characters
  3102. ;    [si]    strings
  3103. ;
  3104. tek_gtxt1:
  3105.     cmp    cx,0
  3106.     jg    tek_gtxt2
  3107.     jmp    tek_gtxt_ex
  3108. tek_gtxt2:
  3109.     push    cx
  3110.     push    si
  3111. ;
  3112.     mov    al,[si]
  3113.     and    al,07Fh
  3114.     cmp    al,' '
  3115.     jae    tek_gtxt3
  3116.     mov    al,' '
  3117. tek_gtxt3:
  3118.     sub    al,' '
  3119.     xor    ah,ah
  3120.     shl    ax,1
  3121.     shl    ax,1
  3122.     shl    ax,1
  3123.     mov    si,offset gfont88
  3124.     add    si,ax
  3125.     mov    di,offset ggdc_buff
  3126.     mov    byte ptr [di],078h    ; TEXTW
  3127.     mov    byte ptr [di+1],8    ; number of parameters
  3128.     add    di,2
  3129.     cld
  3130.     mov    cx,8
  3131.     push    es
  3132.     push    ds
  3133.     pop    es
  3134.     rep    movsb
  3135.     pop    es
  3136. ;    add    di,8
  3137.     mov    byte ptr [di],0FFh    ; set terminator
  3138.     mov    si,offset ggdc_buff
  3139.     call    send_to_GGDC
  3140. ;
  3141.     mov    ax,tek_cur_x
  3142.     mov    bx,tek_cur_y
  3143.     call    tek40_dev_cood
  3144.     mov    di,offset ggdc_buff
  3145. ;@@    mov    cx,GGDC_GREEN_PLANE    ; cursor graphic plane
  3146.     xor    cx,cx
  3147.     call    gcsrw
  3148.     mov    byte ptr [di],20h
  3149.     mov    byte ptr [di+1],0
  3150.     add    di,2
  3151.     mov    byte ptr [di],04Ch    ; VEXTW
  3152.     mov    byte ptr [di+1],3    ; number of parameters
  3153.     mov    al,010h            ; normal text
  3154.     or    al,tek_gtxt_dr        ; set text dir
  3155.     mov    byte ptr [di+2],al
  3156.     mov    byte ptr [di+3],07h
  3157.     mov    byte ptr [di+4],0
  3158.     mov    byte ptr [di+5],068h    ; TEXTE
  3159.     mov    byte ptr [di+6],0
  3160.     mov    byte ptr [di+7],0FFh    ; terminator
  3161.     mov    si,offset ggdc_buff
  3162.     mov    di,si
  3163. ;@@    call    send_to_GGDC
  3164.     mov    ax,tek_lncol        ; set text color
  3165.     call    GGDC_color
  3166.     mov    ax,tek_gtxt_ux
  3167.     add    tek_cur_x,ax
  3168.     mov    ax,tek_gtxt_uy
  3169.     add    tek_cur_y,ax
  3170. ;
  3171.     pop    si
  3172.     pop    cx
  3173.     inc    si
  3174.     dec    cx
  3175.     jmp    tek_gtxt1
  3176. tek_gtxt_ex:
  3177.     ret
  3178. tek_gtxt    endp
  3179. ;
  3180. ; Routines for Fill Area
  3181. ;
  3182. scan_clr    proc    near
  3183. ;
  3184. ; Purpose: Clear the scan buffer, scan_buf.
  3185. ; Input:   none
  3186. ; Output:  none
  3187. ;
  3188.     push    ax
  3189.     push    cx
  3190.     push    di
  3191.     push    es
  3192. ;
  3193.     cld
  3194.     mov    cx,40            ; size of the scan buffer in words
  3195.     mov    di,offset scan_buf
  3196.     push    ds
  3197.     pop    es            ; es = ds
  3198.     xor    ax,ax            ; data
  3199.     rep    stosw            ; string clear
  3200. ;
  3201.     pop    es
  3202.     pop    di
  3203.     pop    cx
  3204.     pop    ax
  3205.     ret
  3206. scan_clr    endp
  3207. ;
  3208. scan_cross    proc    near
  3209. ;
  3210. ; Purpose:  calculate the cross point of the line and scan_y
  3211. ; Input:    san_y, [si], scan_xmin, scan_xmax, bit_on
  3212. ; Output:   scan_buf
  3213. ; WorkArea: pc98_x1, pc98_y1, pc98_x2, pc98_y2
  3214. ;
  3215.     push    ax
  3216.     push    bx
  3217.     push    dx
  3218. ;
  3219.     mov    ax,[si+2]        ; y1
  3220.     mov    bx,[si+6]        ; y2
  3221.     cmp    bx,ax            ; y2 > y1 ?
  3222.     jg    scan_cross_1        ; g=yes
  3223.     mov    pc98_y1,bx
  3224.     mov    pc98_y2,ax
  3225.     mov    ax,[si+4]
  3226.     mov    bx,[si]
  3227.     jmp    scan_cross_2
  3228. scan_cross_1:
  3229.     mov    pc98_y1,ax
  3230.     mov    pc98_y2,bx
  3231.     mov    ax,[si]
  3232.     mov    bx,[si+4]
  3233. scan_cross_2:
  3234.     mov    pc98_x1,ax
  3235.     mov    pc98_x2,bx
  3236.     mov    ax,scan_y
  3237.     cmp    ax,pc98_y1        ; scan_y >= y1
  3238.     jge    scan_cross_3        ; ge=yes
  3239.     jmp    scan_cross_ex
  3240. scan_cross_3:
  3241.     cmp    ax,pc98_y2        ; scan_y < y2
  3242.     jl    scan_cross_4        ; l=yes
  3243.     jmp    scan_cross_ex
  3244. scan_cross_4:
  3245.     sub    ax,pc98_y1        ; ax = scan_y - y1
  3246.     mov    bx,pc98_x2
  3247.     sub    bx,pc98_x1        ; bx = x2 - x1
  3248.     imul    bx            ; dx:ax =(scan_y - y1)*(x2-x1)
  3249.     mov    bx,pc98_y2
  3250.     sub    bx,pc98_y1        ; bx = y2 - y1
  3251.     idiv    bx            ; dx:ax =(scan_y-y1)*(x2-x1)/(y2-y1)
  3252.     add    ax,pc98_x1
  3253.     cmp    ax,scan_xmin        ; scan_x < xmin ?
  3254.     jge    scan_cross_5        ; ge = no
  3255.     mov    ax,scan_xmin
  3256. scan_cross_5:
  3257.     cmp    ax,scan_xmax        ; scan_x > xmax ?
  3258.     jle    scan_cross_6        ; le = no
  3259.     mov    ax,scan_xmax
  3260. scan_cross_6:
  3261.     push    ax
  3262.     and    ax,07h
  3263.     mov    bx,offset bit_on
  3264.     add    bx,ax
  3265.     mov    dl,[bx]
  3266.     pop    ax
  3267.     mov    bx,offset scan_buf
  3268.     shr    ax,1
  3269.     shr    ax,1
  3270.     shr    ax,1
  3271.     add    bx,ax
  3272.     xor    [bx],dl
  3273. scan_cross_ex:
  3274.     pop    dx
  3275.     pop    bx
  3276.     pop    ax
  3277.     ret
  3278. scan_cross    endp
  3279. ;
  3280. scan_fill    proc    near
  3281. ;
  3282. ; fill the scan line
  3283. ;
  3284.     push    ax
  3285.     push    bx
  3286.     push    cx
  3287.     push    dx
  3288.     push    si
  3289. ;
  3290.     mov    si,offset scan_buf
  3291.     add    si,scan_xstr
  3292.     mov    dx,0ff00h        ; dh:fill, dl:no-fill
  3293.     mov    cx,scan_xlen
  3294. scan_fill_1:
  3295.     mov    al,[si]
  3296.     cmp    al,0
  3297.     jne    scan_fill_2
  3298.     mov    [si],dl
  3299.     jmp    scan_fill_5
  3300. scan_fill_2:
  3301.     push    cx
  3302.     mov    cx,8
  3303.     mov    bx,offset bit_on
  3304. scan_fill_3:
  3305.     mov    ah,[bx]
  3306.     and    ah,al
  3307.     cmp    ah,0
  3308.     je    scan_fill_4
  3309.     xchg    dh,dl
  3310. scan_fill_4:
  3311.     mov    ah,[bx]
  3312.     and    ah,dl
  3313.     or    [si],ah
  3314.     inc    bx
  3315.     loop    scan_fill_3
  3316.     pop    cx
  3317. scan_fill_5:
  3318.     inc    si
  3319.     loop    scan_fill_1
  3320.     pop    si
  3321.     pop    dx
  3322.     pop    cx
  3323.     pop    bx
  3324.     pop    ax
  3325.     ret
  3326. scan_fill    endp
  3327. ;
  3328. scan_put    proc    near
  3329. ;
  3330. ; Put the scan line to the graphic screen
  3331. ;
  3332.     push    es
  3333.     cld
  3334.     mov    dx,1
  3335.     xor    ch,ch
  3336.     mov    cl,gplane_nums
  3337.     mov    bx,offset gplane_segm
  3338. scan_put1:
  3339.     push    bx
  3340.     push    cx
  3341.     mov    ax,[bx]
  3342.     mov    es,ax
  3343.     mov    di,scan_ofs
  3344.     mov    si,offset scan_buf
  3345.     add    si,scan_xstr
  3346.     mov    cx,scan_xlen
  3347.     test    tek_facol,dx
  3348.     jz    scan_put3
  3349. scan_put2:
  3350.     lodsb
  3351.     or    es:[di],al
  3352.     inc    di
  3353.     loop    scan_put2
  3354.     jmp    scan_put4
  3355. scan_put3:
  3356.     lodsb
  3357.     xor    al,0ffh
  3358.     and    es:[di],al
  3359.     inc    di
  3360.     loop    scan_put3
  3361. scan_put4:
  3362.     pop    cx
  3363.     pop    bx
  3364.     add    bx,2
  3365.     shl    dx,1
  3366.     loop    scan_put1
  3367. scan_put_ex:
  3368.     pop    es
  3369.     ret
  3370. scan_put    endp
  3371. ;
  3372. tek_fill    proc    near
  3373. ;
  3374. ; Fill area
  3375. ;
  3376.     mov    ax,scan_ymin
  3377.     mov    scan_y,ax
  3378.     shl    ax,1
  3379.     shl    ax,1
  3380.     add    ax,scan_y        ; ax=scan_y*5
  3381.     mov    cx,4
  3382.     shl    ax,cl            ; ax=scan_y*80
  3383.     mov    scan_ofs,ax
  3384.     mov    ax,scan_xmin
  3385.     mov    cx,3
  3386.     shr    ax,cl
  3387.     mov    scan_xstr,ax        ; start byte address in x
  3388.     add    scan_ofs,ax
  3389.     mov    ax,scan_xmax
  3390.     mov    cx,3
  3391.     shr    ax,cl
  3392.     sub    ax,scan_xstr
  3393.     inc    ax
  3394.     mov    scan_xlen,ax
  3395. ;
  3396.     cmp    gdisp_mode,0
  3397.     je    tek_fill_1
  3398.     jmp    tek_fill_GC1
  3399. tek_fill_1:
  3400.     mov    ax,scan_y
  3401.     cmp    ax,scan_ymax
  3402.     jle    tek_fill_2
  3403.     jmp    tek_fill_ex
  3404. tek_fill_2:
  3405.     call    scan_clr            ; clear the scan buffer
  3406.     mov    si,offset tek41_fabuf        ; position of the line
  3407. ;
  3408. tek_fill_3:
  3409.     mov    cx,[si]                ; get number of points
  3410.     jcxz    tek_fill_5
  3411.     add    si,2
  3412. tek_fill_4:
  3413.     call    scan_cross
  3414.     add    si,4
  3415.     loop    tek_fill_4
  3416.     add    si,4
  3417.     jmp    tek_fill_3
  3418. tek_fill_5:
  3419.     call    scan_fill
  3420.     call    scan_put
  3421.     inc    scan_y
  3422.     add    scan_ofs,80
  3423.     jmp    tek_fill_1
  3424. ;
  3425. tek_fill_GC1:
  3426.     cld
  3427.     mov    al,0C0h        ; GRCG on, RMW mode, all planes are active
  3428.     out    7Ch,al
  3429.     mov    cx,4
  3430.     mov    dx,1
  3431. tek_fill_GC2:
  3432.     test    tek_facol,dx
  3433.     jz    tek_fill_GC3
  3434.     mov    al,0FFh
  3435.     jmp    tek_fill_GC4
  3436. tek_fill_GC3:
  3437.     mov    al,0
  3438. tek_fill_GC4:
  3439.     out    7Eh,al        ; write tile reg.
  3440.     shl    dx,1
  3441.     loop    tek_fill_GC2
  3442. ;
  3443.     push    es
  3444. tek_fill_GC5:
  3445.     mov    ax,scan_y
  3446.     cmp    ax,scan_ymax
  3447.     jg    tek_fill_GC7
  3448.     call    scan_clr            ; clear the scan buffer
  3449.     mov    si,offset tek41_fabuf        ; position of the line
  3450. tek_fill_GC8:
  3451.     mov    cx,[si]                ; number of lines
  3452.     jcxz    tek_fill_GC9
  3453.     add    si,2
  3454. tek_fill_GC6:
  3455.     call    scan_cross
  3456.     add    si,4
  3457.     loop    tek_fill_GC6
  3458.     add    si,4
  3459.     jmp    tek_fill_GC8
  3460. tek_fill_GC9:
  3461.     call    scan_fill
  3462.     mov    di,scan_ofs
  3463.     mov    ax,gplane_segm
  3464.     mov    es,ax
  3465.     mov    si,offset scan_buf
  3466.     add    si,scan_xstr
  3467.     mov    cx,scan_xlen
  3468.     rep    movsb
  3469.     inc    scan_y
  3470.     add    scan_ofs,80
  3471.     jmp    tek_fill_GC5
  3472. tek_fill_GC7:
  3473.     mov    al,040h                ; GRCG off
  3474.     out    7Ch,al
  3475.     pop    es
  3476. ;
  3477. tek_fill_ex:
  3478.     ret
  3479. tek_fill    endp
  3480. ;
  3481. tek41_getcol    proc    near
  3482. ;
  3483. ; convert tek41 color index to normal index
  3484. ;
  3485.     push    bx
  3486.     and    ax,0fh
  3487.     mov    bx,offset tek41_col
  3488.     add    bx,ax
  3489.     mov    ax,[bx]
  3490.     pop    bx
  3491.     ret
  3492. tek41_getcol    endp
  3493. ;
  3494. set_gcolor    proc    near
  3495. ;
  3496. ; set graphic color
  3497. ;
  3498.     push    ax
  3499.     push    si
  3500.     mov    al,vt100_gflag
  3501.     and    al,07Fh            ; mask text screen ctrl bit
  3502.     cmp    al,0
  3503.     jne    set_gcolor_n0
  3504.     mov    si,offset gnrm_color
  3505.     jmp    set_gcolor_do
  3506. set_gcolor_n0:
  3507.     cmp    al,1
  3508.     jne    set_gcolor_n1
  3509.     mov    si,offset gbck_color
  3510.     jmp    set_gcolor_do
  3511. set_gcolor_n1:
  3512.     cmp    al,2
  3513.     jne    set_gcolor_n2
  3514.     mov    si,offset sixel_col
  3515.     jmp    set_gcolor_do
  3516. set_gcolor_n2:
  3517.     cmp    al,3
  3518.     jne    set_gcolor_n3
  3519.     mov    si,offset sixel_col
  3520.     jmp    set_gcolor_do
  3521. set_gcolor_n3:
  3522.     cmp    al,4
  3523.     jne    set_gcolor_n4
  3524.     mov    si,offset tek_col
  3525.     jmp    set_gcolor_do
  3526. set_gcolor_n4:
  3527.     cmp    al,5
  3528.     jne    set_gcolor_n5
  3529.     mov    si,offset tek_col
  3530.     jmp    set_gcolor_do
  3531. set_gcolor_n5:
  3532.     jmp    set_gcolor_ex
  3533. set_gcolor_do:
  3534.     call    set_gpalette
  3535.     call    gdisp_on
  3536.     mov    al,1
  3537.     test    vt100_gflag,80h
  3538.     jz    set_gcolor_do1
  3539.     mov    al,tek_dialog_vsbl
  3540. set_gcolor_do1:
  3541.     call    text_scrn
  3542. set_gcolor_ex:
  3543.     pop    si
  3544.     pop    ax
  3545.     ret
  3546. set_gcolor    endp
  3547. ;
  3548. sixel_clear    proc    near
  3549.     call    gcls
  3550.     ret
  3551. sixel_clear    endp
  3552.  
  3553. sixel_in    proc    near
  3554.     call    gcls
  3555.     mov    si,offset sixel_col
  3556.     call    set_gpalette
  3557.     call    gdisp_on
  3558.     mov    sixel_x,0
  3559.     mov    sixel_y,0
  3560.     mov    sixel_state,0
  3561.     mov    repeat_count,0
  3562.     mov    sixel_nbuf,0
  3563.     mov    sixel_palette,4
  3564.     ret
  3565. sixel_in    endp
  3566. ;
  3567. sixel    proc    near
  3568.     cmp    al,018h        ; CAN ?
  3569.     je    sixel_0        ; e = yes
  3570.     cmp    al,01bh        ; ESC ?
  3571.     je    sixel_0        ; e = yes
  3572.     cmp    al,01fh
  3573.     ja    sixel_0
  3574.     jmp    sixel_ex    ; ignore other 0/0 - 0/15 characters
  3575. sixel_0:
  3576.     cmp    sixel_state,0
  3577.     jne    sixel_num
  3578.     jmp    sixel_1
  3579. ;
  3580. ;   sixel number (decimal characters)
  3581. sixel_num:
  3582.     cmp    al,'0'
  3583.     jae    sixel_num1
  3584.     jmp    sixel_num_ex
  3585. sixel_num1:
  3586.     cmp    al,'9'
  3587.     jbe    sixel_num2
  3588.     jmp    sixel_num_ex
  3589. sixel_num2:
  3590.     xor    ah,ah
  3591.     sub    al,'0'
  3592.     push    ax
  3593.     mov    ax,sixel_nbuf
  3594.     add    sixel_nbuf,ax
  3595.     mov    cx,3
  3596.     shl    ax,cl
  3597.     add    sixel_nbuf,ax            ; sixel_nbuf *= 10
  3598.     pop    ax
  3599.     add    sixel_nbuf,ax
  3600.     jmp    sixel_ex
  3601. ;
  3602. sixel_num_ex:
  3603.     cmp    sixel_state,SIXEL_IN_REPEAT
  3604.     jne    sixel_num_ex1
  3605.     jmp    sixel_num_exr
  3606. sixel_num_ex1:
  3607.     cmp    sixel_state,SIXEL_IN_PALETTE
  3608.     jne    sixel_num_ex2
  3609.     jmp    sixel_num_exp
  3610. sixel_num_ex2:
  3611.     jmp    sixel_num_exx
  3612. sixel_num_exr:
  3613.     push    ax
  3614.     mov    ax,sixel_nbuf
  3615.     mov    repeat_count,ax
  3616.     pop    ax
  3617.     jmp    sixel_num_exx
  3618. sixel_num_exp:
  3619.     push    ax
  3620.     push    di
  3621.     mov    di,offset sixel_palette
  3622.     mov    ax,sixel_pal_dest
  3623.     add    di,ax
  3624.     add    di,ax
  3625.     mov    ax,sixel_nbuf
  3626.     mov    [di],ax
  3627.     pop    di
  3628.     pop    ax
  3629.     cmp    al,';'
  3630.     je    sixel_num_exp_1
  3631.     jmp    sixel_num_exp_x
  3632. sixel_num_exp_1:
  3633.     add    sixel_pal_dest,1
  3634.     mov    sixel_nbuf,0
  3635.     jmp    sixel_ex
  3636. sixel_num_exp_x:
  3637.     cmp    sixel_pal_dest,4
  3638.     je    sixel_num_exp_s
  3639.     mov    sixel_pal_dest,0
  3640.     jmp    sixel_num_exx
  3641. sixel_num_exp_s:
  3642.     push    si
  3643.     mov    si,offset sixel_palette
  3644.     cmp    WORD PTR [si+2],1
  3645.     jne    sixel_num_exp_s1
  3646.     add    si,4
  3647.     call    HLS_to_RGB
  3648.     jmp    sixel_num_exp_s2
  3649. sixel_num_exp_s1:
  3650.     add    si,4
  3651. sixel_num_exp_s2:
  3652.     call    RGB100_to_255
  3653.     push    ax
  3654.     push    bx
  3655.     mov    bx,offset sixel_col
  3656.     mov    ax,sixel_palette
  3657.     add    bx,ax
  3658.     add    bx,ax
  3659.     add    bx,ax
  3660.     mov    ax,[si]                ; R value
  3661.     mov    [bx],al
  3662.     mov    ax,[si+2]            ; G value
  3663.     mov    [bx+1],al
  3664.     mov    ax,[si+4]            ; B value
  3665.     mov    [bx+2],al
  3666.     mov    si,offset sixel_col
  3667.     call    set_gpalette
  3668.     pop    bx
  3669.     pop    ax
  3670.     pop    si
  3671. sixel_num_exx:
  3672.     mov    sixel_nbuf,0
  3673. ;
  3674. sixel_1:
  3675.     cmp    al,07Eh
  3676.     ja    sixel_2
  3677.     cmp    al,03Fh
  3678.     jb    sixel_2                ; b=no. special char.
  3679.     mov    sixel_state,0
  3680.     xor    ah,ah
  3681.     sub    al,03Fh
  3682.     call    sixel_put
  3683.     mov    sixel_state,0            ; clear the sixel state
  3684.     mov    sixel_nbuf,0
  3685.     mov    repeat_count,0            ; clear the repeat counter
  3686.     jmp    sixel_ex
  3687. sixel_2:
  3688.     cmp    al,'!'                ; repeat count prefix ?
  3689.     jne    sixel_2_1            ; ne = no.
  3690.     mov    sixel_state,SIXEL_IN_REPEAT    ; yes, set repeat count flag
  3691.     mov    repeat_count,0            ;   and clear the counter
  3692.     mov    sixel_nbuf,0
  3693.     jmp    sixel_ex
  3694. sixel_2_1:
  3695.     cmp    al,'#'                ; palette ?
  3696.     jne    sixel_3                ; ne = no.
  3697.     mov    sixel_state,SIXEL_IN_PALETTE
  3698.     mov    sixel_pal_dest,0
  3699.     mov    sixel_nbuf,0
  3700.     jmp    sixel_ex
  3701. sixel_3:
  3702.     cmp    al,'$'                ; Graphic CR ?
  3703.     jne    sixel_4                ; ne = no.
  3704.     mov    sixel_x,0            ; yes, go to left margin
  3705.     mov    sixel_state,0            ; clear the sixel state
  3706.     mov    repeat_count,0            ; and clear the counter
  3707.     jmp    sixel_ex
  3708. sixel_4:
  3709.     cmp    al,'-'                ; Graphic NL ?
  3710.     jne    sixel_5                ; ne = no.
  3711.     mov    sixel_x,0            ; yes, go to left margin
  3712.     xor    cx,cx                ; and move Y by repeat count
  3713. sixel_4_1:
  3714.     add    sixel_y,6
  3715.     inc    cx
  3716.     cmp    cx,repeat_count
  3717.     jl    sixel_4_1
  3718.     mov    sixel_state,0
  3719.     mov    repeat_count,0
  3720.     jmp    sixel_ex
  3721. sixel_5:
  3722.     cmp    al,020h                ; character ?
  3723.     jb    sixel_ex            ; b=no. it's control char.
  3724.     cmp    al,07Fh                ; DEL/C1/GR ?
  3725.     jae    sixel_ex            ; e=yes. ignore it.
  3726.     mov    sixel_state,0
  3727.     mov    repeat_count,0
  3728. sixel_ex:
  3729.     ret
  3730. sixel    endp
  3731. ;
  3732. ; Light on the bits in BH if the plane index is on,
  3733. ; Light off the bits in BL if the plane index is off.
  3734. ;
  3735. sixel_plane_on    proc    near
  3736.     push    ax
  3737.     push    bx
  3738.     mov    bl,bh
  3739.     xor    bl,0ffh
  3740.     mov    ax,sixel_segm
  3741.     add    ax,CPU_BLUE_PLANE
  3742.     mov    es,ax
  3743.     test    sixel_palette,1
  3744.     jz    sixel_plane_on1
  3745.     or    es:[si],bh
  3746.     jmp    sixel_plane_on2
  3747. sixel_plane_on1:
  3748.     and    es:[si],bl
  3749. sixel_plane_on2:
  3750.     mov    ax,sixel_segm
  3751.     add    ax,CPU_RED_PLANE
  3752.     mov    es,ax
  3753.     test    sixel_palette,2
  3754.     jz    sixel_plane_on3
  3755.     or    es:[si],bh
  3756.     jmp    sixel_plane_on4
  3757. sixel_plane_on3:
  3758.     and    es:[si],bl
  3759. sixel_plane_on4:
  3760.     mov    ax,sixel_segm
  3761.     add    ax,CPU_GREEN_PLANE
  3762.     mov    es,ax
  3763.     test    sixel_palette,4
  3764.     jz    sixel_plane_on5
  3765.     or    es:[si],bh
  3766.     jmp    sixel_plane_on6
  3767. sixel_plane_on5:
  3768.     and    es:[si],bl
  3769. sixel_plane_on6:
  3770.     mov    ax,sixel_segm
  3771.     add    ax,CPU_EXTRA_PLANE
  3772.     mov    es,ax
  3773.     test    sixel_palette,8
  3774.     jz    sixel_plane_on7
  3775.     or    es:[si],bh
  3776.     jmp    sixel_plane_on8
  3777. sixel_plane_on7:
  3778.     and    es:[si],bl
  3779. sixel_plane_on8:
  3780.     pop    bx
  3781.     pop    ax
  3782.     ret
  3783. sixel_plane_on    endp
  3784. ;
  3785. ; put sixel character in AL to the graphic screen
  3786. ;
  3787. sixel_put    proc    near
  3788.     push    si
  3789.     push    es
  3790.     mov    sixel_char,al        ; save the sixel character
  3791.     cmp    sixel_y,SIXEL_YMAX
  3792.     jle    sixel_put_1
  3793.     mov    ax,sixel_y
  3794.     sub    ax,SIXEL_YMAX
  3795.     mov    cx,ax
  3796. ;@@    call    sixel_mono_scroll
  3797.     call    sixel_col_scroll
  3798.     mov    sixel_y,SIXEL_YMAX
  3799. sixel_put_1:
  3800.     cmp    sixel_x,SIXEL_XMAX
  3801.     jle    sixel_put_2
  3802.     jmp    sixel_put_6
  3803. sixel_put_2:
  3804.     mov    ax,sixel_y
  3805.     mov    sixel_segm,ax
  3806.     shl    ax,1
  3807.     shl    ax,1
  3808.     add    sixel_segm,ax        ; sixel_segm = sixel_y*5 + segm_0
  3809.     mov    ax,sixel_x
  3810.     shr    ax,1
  3811.     shr    ax,1
  3812.     shr    ax,1
  3813.     mov    sixel_byte,ax        ; sixel_byte = sixel_x / 8
  3814.     mov    ax,sixel_x
  3815.     and    ax,07h            ; ax = sixel_x % 8
  3816.     cmp    ax,0            ; byte boundary ?
  3817.     jne    sixel_put_2_1        ; ne = no, not.
  3818.     cmp    repeat_count,8        ; repeat_count >= 8 ?
  3819.     jl    sixel_put_2_1        ; l = no, not.
  3820.     jmp    sixel_put_byte1
  3821. sixel_put_2_1:
  3822.     mov    bx,offset bit_on
  3823.     add    bx,ax
  3824.     mov    cl,[bx]
  3825.     mov    sixel_on,cl        ; bit mask to ON the graphic bit
  3826.     mov    bx,offset bit_off
  3827.     add    bx,ax
  3828.     mov    cl,[bx]
  3829.     mov    sixel_off,cl        ; bit mask to OFF the graphic bit
  3830.     mov    cx,6            ; repeat count
  3831.     cld
  3832.     mov    si,sixel_byte
  3833.     mov    al,sixel_char
  3834.     mov    dl,1
  3835. sixel_put_3:
  3836.     test    al,dl
  3837.     jz    sixel_put_4
  3838.     mov    bh,sixel_on
  3839.     call    sixel_plane_on
  3840.     jmp    sixel_put_5
  3841. sixel_put_4:
  3842.     cmp    sixel_replace,1        ; replace mode?
  3843.     jne    sixel_put_5        ; ne=no.
  3844.     mov    bh,sixel_off
  3845.     and    es:[si],bh
  3846. sixel_put_5:
  3847.     shl    dl,1
  3848.     add    si,80
  3849.     loop    sixel_put_3
  3850. sixel_put_6:
  3851.     add    sixel_x,1
  3852.     dec    repeat_count
  3853.     jmp    sixel_put_7
  3854. ;
  3855. sixel_put_byte1:
  3856.     mov    ax,sixel_segm
  3857.     mov    es,ax
  3858.     mov    cx,6            ; repeat count
  3859.     cld
  3860.     mov    si,sixel_byte
  3861.     mov    al,sixel_char
  3862.     mov    dl,1
  3863. sixel_put_byte3:
  3864.     test    al,dl
  3865.     jz    sixel_put_byte4
  3866.     mov    bh,0ffh
  3867.     call    sixel_plane_on
  3868.     jmp    sixel_put_byte5
  3869. sixel_put_byte4:
  3870.     cmp    sixel_replace,1        ; replace mode?
  3871.     jne    sixel_put_byte5        ; ne=no.
  3872.     mov    bh,0
  3873.     mov    es:[si],bh
  3874. sixel_put_byte5:
  3875.     shl    dl,1
  3876.     add    si,80
  3877.     loop    sixel_put_byte3
  3878. sixel_put_byte6:
  3879.     add    sixel_x,8
  3880.     sub    repeat_count,8
  3881. ;
  3882. sixel_put_7:
  3883.     cmp    repeat_count,0
  3884.     jle    sixel_put_8
  3885.     jmp    sixel_put_1
  3886. sixel_put_8:
  3887.     mov    repeat_count,0
  3888.     pop    es
  3889.     pop    si
  3890.     ret
  3891. sixel_put    endp
  3892. ;
  3893. sixel_mono_scroll    proc    near
  3894. ;
  3895. ; scroll up  CX lines
  3896. ;
  3897.     push    bx
  3898.     push    si
  3899.     push    di
  3900.     push    es
  3901.     push    ds
  3902. ;
  3903.     cld
  3904. ;
  3905.     mov    si,0            ; offset of the top of the buffer
  3906.     mov    di,0            ; for both dest. and source.
  3907.     mov    ax,cx
  3908.     add    ax,cx
  3909.     shl    ax,1
  3910.     add    ax,cx            ; ax = n * 5, number of para.
  3911.     mov    bx,ax            ; save it for later use
  3912.     mov    ax,(CPU_BLUE_PLANE+1)    ; top of the buffer
  3913.     mov    es,ax            ; dest. segm.
  3914.     add    ax,bx
  3915.     mov    ds,ax            ; source segm.
  3916.     mov    cx,32760        ; number of words of the buffer
  3917.     rep    movsw            ; move words
  3918.     mov    si,0            ; clear offsets
  3919.     mov    di,0            ;  for both dest. and source
  3920.     mov    ax,CPU_GREEN_PLANE
  3921.     mov    ds,ax            ; source segm.
  3922.     sub    ax,bx
  3923.     mov    es,ax            ; dest. segm.
  3924.     mov    cx,16000        ; scroll with status line
  3925.     mov    ax,bx            ; ax = n * 5
  3926.     shl    ax,1
  3927.     shl    ax,1
  3928.     shl    ax,1            ; ax = n * 40
  3929.     sub    cx,ax
  3930.     rep    movsw
  3931. ;
  3932.     pop    ds
  3933.     pop    es
  3934.     pop    di
  3935.     pop    si
  3936.     pop    bx
  3937.     ret
  3938. sixel_mono_scroll    endp
  3939.  
  3940. sixel_col_scroll    proc    near
  3941. ;
  3942. ; scroll-up cx lines in color mode
  3943. ;
  3944.     push    ax
  3945.     push    bx
  3946.     push    cx
  3947.     push    si
  3948.     push    di
  3949.     push    es
  3950.     push    ds
  3951. ;
  3952.     mov    ax,cx
  3953.     shl    ax,1
  3954.     shl    ax,1        ; ax = n * 4
  3955.     add    ax,cx        ; ax = n * 5
  3956.     shl    ax,1
  3957.     shl    ax,1
  3958.     shl    ax,1
  3959.     shl    ax,1        ; ax = n * 80
  3960.     mov    bx,ax
  3961.     cld
  3962.     mov    cx,32000
  3963.     sub    cx,bx        ; number of bytes
  3964.     shr    cx,1        ; number of words
  3965.     mov    di,0
  3966.     mov    si,bx
  3967.     mov    ax,CPU_BLUE_PLANE
  3968.     mov    es,ax
  3969.     mov    ds,ax
  3970.     rep    movsw
  3971. ;
  3972.     mov    cx,32000
  3973.     sub    cx,bx
  3974.     shr    cx,1
  3975.     mov    di,0
  3976.     mov    si,bx
  3977.     mov    ax,CPU_RED_PLANE
  3978.     mov    es,ax
  3979.     mov    ds,ax
  3980.     rep    movsw
  3981. ;
  3982.     mov    cx,32000
  3983.     sub    cx,bx
  3984.     shr    cx,1
  3985.     mov    di,0
  3986.     mov    si,bx
  3987.     mov    ax,CPU_GREEN_PLANE
  3988.     mov    es,ax
  3989.     mov    ds,ax
  3990.     rep    movsw
  3991. ;
  3992.     mov    cx,32000
  3993.     sub    cx,bx
  3994.     shr    cx,1
  3995.     mov    di,0
  3996.     mov    si,bx
  3997.     mov    ax,CPU_EXTRA_PLANE
  3998.     mov    es,ax
  3999.     mov    ds,ax
  4000.     rep    movsw
  4001. ;
  4002.     pop    ds
  4003.     pop    es
  4004.     pop    di
  4005.     pop    si
  4006.     pop    cx
  4007.     pop    bx
  4008.     pop    ax
  4009.     ret
  4010. sixel_col_scroll    endp
  4011.  
  4012. sixel_rollup    proc    near
  4013.     push    bx
  4014.     push    si
  4015.     push    di
  4016.     push    es
  4017.     push    ds
  4018. ;
  4019.     mov    ax,cx
  4020.     shl    ax,1
  4021.     shl    ax,1
  4022.     add    ax,cx            ; ax = n * 5
  4023.     mov    bx,ax            ; bx = ax = n * 5
  4024.     shl    ax,1
  4025.     shl    ax,1
  4026.     shl    ax,1            ; ax = n * 40
  4027. ;
  4028. ; copy top n-lines to the save buffer
  4029. ;
  4030.     cld
  4031.     mov    si,0
  4032.     mov    di,0
  4033.     push    ax
  4034.     mov    ax,(CPU_BLUE_PLANE+1)    ; top segment
  4035.     mov    ds,ax
  4036.     mov    ax,(CPU_GREEN_PLANE+2000)    ; save-buffer segment
  4037.     mov    es,ax
  4038.     pop    ax            ; ax = n * 40
  4039.     mov    cx,ax
  4040.     rep    movsw
  4041. ;
  4042. ; roll-up n-lines
  4043. ;
  4044.     mov    si,0
  4045.     mov    di,0
  4046.     push    ax
  4047.     mov    ax,(CPU_BLUE_PLANE+1)
  4048.     mov    es,ax            ; destination
  4049.     add    ax,bx
  4050.     mov    ds,ax            ; source
  4051.     mov    cx,32760
  4052.     rep    movsw
  4053. ;
  4054.     mov    si,0
  4055.     mov    di,0
  4056.     mov    ax,CPU_GREEN_PLANE
  4057.     mov    es,ax
  4058.     add    ax,bx
  4059.     mov    ds,ax
  4060.     mov    cx,15360
  4061.     pop    ax
  4062.     sub    cx,ax
  4063.     rep    movsw
  4064. ;
  4065. ;  Copy saved n-lines to the bottom
  4066. ;
  4067.     mov    si,0
  4068.     mov    di,0
  4069.     push    ax
  4070.     mov    ax,(CPU_GREEN_PLANE+1920)
  4071.     sub    ax,bx
  4072.     mov    es,ax            ; destination
  4073.     mov    ax,(CPU_GREEN_PLANE+2000)
  4074.     mov    ds,ax            ; source
  4075.     pop    ax
  4076.     mov    cx,ax
  4077.     rep    movsw
  4078. ;
  4079.     pop    ds
  4080.     pop    es
  4081.     pop    di
  4082.     pop    si
  4083.     pop    bx
  4084.     ret
  4085. sixel_rollup    endp
  4086.  
  4087. sixel_rolldown    proc    near
  4088.     push    bx
  4089.     push    si
  4090.     push    di
  4091.     push    es
  4092.     push    ds
  4093. ;
  4094.     mov    ax,cx
  4095.     shl    ax,1
  4096.     shl    ax,1
  4097.     add    ax,cx        ; ax = n * 5
  4098.     mov    bx,ax        ; bx = n * 5, save it for later use
  4099.     shl    ax,1
  4100.     shl    ax,1
  4101.     shl    ax,1        ; ax = n * 40
  4102. ;
  4103. ;  Copy bottom n-lines to the save buffer
  4104. ;
  4105.     cld
  4106.     mov    si,0
  4107.     mov    di,0
  4108.     push    ax
  4109.     mov    ax,(CPU_GREEN_PLANE+1920)    ; 1920 = (24x16)lines x 5 segm.
  4110.     sub    ax,bx
  4111.     mov    ds,ax        ; source segm.
  4112.     mov    ax,(CPU_GREEN_PLANE+2000)    ; save segm.
  4113.     mov    es,ax        ; destination
  4114.     pop    ax        ; ax = n * 40
  4115.     mov    cx,ax
  4116.     rep    movsw        ; store n-lines to save segm.
  4117. ;
  4118. ;  Rolldown n-lines
  4119. ;
  4120.     std
  4121.     mov    si,30718    ; bottom offset address (word boundary)
  4122.     mov    di,30718
  4123.     push    ax
  4124.     mov    ax,CPU_GREEN_PLANE
  4125.     mov    es,ax        ; destination
  4126.     sub    ax,bx
  4127.     mov    ds,ax        ; source
  4128.     mov    cx,15360    ; cx = 24 x 16 x 40 words
  4129.     rep    movsw        ; reverse move in Green segm.
  4130. ;
  4131.     mov    si,0FFEEh    ; bottom offset address (word boundary)
  4132.     mov    di,0FFEEh
  4133.     mov    ax,(CPU_BLUE_PLANE+1)
  4134.     mov    es,ax
  4135.     sub    ax,bx
  4136.     mov    ds,ax
  4137.     mov    cx,32760    ; number of words in the buffer
  4138.     pop    ax        ; ax = n * 40
  4139.     sub    cx,ax
  4140.     rep    movsw
  4141. ;
  4142.     cld
  4143.     mov    si,0
  4144.     mov    di,0
  4145.     push    ax
  4146.     mov    ax,(CPU_GREEN_PLANE+2000)
  4147.     mov    ds,ax
  4148.     mov    ax,(CPU_BLUE_PLANE+1)
  4149.     mov    es,ax
  4150.     pop    ax        ; ax = n * 40
  4151.     mov    cx,ax
  4152.     rep    movsw
  4153. ;
  4154.     pop    ds
  4155.     pop    es
  4156.     pop    di
  4157.     pop    si
  4158.     pop    bx
  4159.     ret
  4160. sixel_rolldown    endp
  4161. ;------------------------------------------------------------------------------
  4162. ;------------------------------------------------------------------------------
  4163. send_to_GGDC    proc    near
  4164. ;
  4165. ;  send commands and parameters
  4166. ;  to graphic GDC
  4167. ;    inputs    DS:[SI]    address of the list
  4168. ;
  4169.     push    ax
  4170.     push    cx
  4171.     push    si
  4172.     cld
  4173. send_to_GGDC_loop1:
  4174.     lodsb
  4175.     cmp    al,0ffh
  4176.     je    send_to_GGDC_exit
  4177.     push    ax
  4178. send_to_GGDC_loop2:
  4179.     in    al,GGDC_STS_PORT
  4180.     test    al,2
  4181.     jne    send_to_GGDC_loop2
  4182.     pop    ax
  4183.     out    GGDC_CMD_PORT,al
  4184.     lodsb
  4185.     mov    cl,al
  4186.     mov    ch,0
  4187.     cmp    cx,0
  4188.     je    send_to_GGDC_loop1
  4189. send_to_GGDC_loop3:
  4190.     lodsb
  4191.     push    ax
  4192. send_to_GGDC_loop4:
  4193.     in    al,GGDC_STS_PORT
  4194.     test    al,2
  4195.     jne    send_to_GGDC_loop4
  4196.     pop    ax
  4197.     out    GGDC_PRM_PORT,al
  4198.     loop    send_to_GGDC_loop3
  4199.     jmp    send_to_GGDC_loop1
  4200. send_to_GGDC_exit:
  4201.     pop    si
  4202.     pop    cx
  4203.     pop    ax
  4204.     ret
  4205. send_to_GGDC    endp
  4206. ;------------------------------------------------------------------------------
  4207. GGDC_color    proc    near
  4208. ;
  4209. ;  send DS:[SI] to graphic GDC with
  4210. ;  color index.
  4211. ;
  4212. ;  inputs
  4213. ;    ax:  color index
  4214. ;    si:  buffer address (used by send_to_GGDC)
  4215. ;    di:  CSR pointer
  4216. ;
  4217.     push    bx
  4218.     push    cx
  4219.     push    dx
  4220.     push    di
  4221. ;
  4222.     mov    bx,[di+3]
  4223.     push    bx
  4224.     mov    bx,[di+5]
  4225.     push    bx
  4226. ;
  4227.     xor    ch,ch
  4228.     mov    cl,gplane_nums
  4229.     mov    bx,offset GDC_plane_address
  4230.     mov    dx,1
  4231. GGDC_color_1:
  4232.     and    byte ptr [di+3],3Fh        ; mask plane address
  4233.     push    ax
  4234.     mov    al,[bx]
  4235.     or    byte ptr [di+3],al        ; add plane address
  4236.     pop    ax
  4237.     inc    bx
  4238.     test    dx,gplane_actv
  4239.     jz    GGDC_color_4            ; skip if non-active plane
  4240.     test    dx,ax                ; test color bit
  4241.     jz    GGDC_color_2
  4242.     mov    byte ptr [di+5],23h         ; write mode = SET
  4243.     jmp    GGDC_color_3
  4244. GGDC_color_2:
  4245.     mov    byte ptr [di+5],22h        ; write mode = CLEAR
  4246. GGDC_color_3:
  4247.     call    send_to_GGDC
  4248. GGDC_color_4:
  4249.     shl    dx,1
  4250.     loop    GGDC_color_1
  4251. ;
  4252.     pop    bx
  4253.     mov    [di+5],bx
  4254.     pop    bx
  4255.     mov    [di+3],bx
  4256. ;
  4257.     pop    di
  4258.     pop    dx
  4259.     pop    cx 
  4260.     pop    bx
  4261.     ret
  4262. GGDC_color    endp
  4263.  
  4264. ;-----------------------------------------------------------------------
  4265. ; Get digitized color index in AL from (r,g,b)
  4266. ; si: (r,g,b) table
  4267. ;
  4268. get_dig_color    proc    near
  4269.     push    cx
  4270.     mov    ch,ah        ; save AH
  4271.     mov    ah,[si]        ; get red
  4272.     mov    cl,6
  4273.     shr    ah,cl
  4274.     and    ah,02h
  4275.     mov    al,ah
  4276.     mov    ah,[si+1]    ; get green
  4277.     mov    cl,5
  4278.     shr    ah,cl
  4279.     and    ah,04h
  4280.     or    al,ah
  4281.     mov    ah,[si+2]    ; get blue
  4282.     mov    cl,7
  4283.     shr    ah,cl
  4284.     and    ah,01h
  4285.     or    al,ah
  4286.     mov    ah,ch        ; restore AH
  4287.     pop    cx
  4288.     ret
  4289. get_dig_color    endp
  4290.  
  4291. HLS_value    proc    near
  4292. ;
  4293. ; input         HLS_n1    n1  [0-100]
  4294. ;               HLS_n2    n2  [0-100]
  4295. ;               AX : hue
  4296. ; output        AX : value
  4297. ;
  4298.     push    bx
  4299.     push    dx
  4300. ;
  4301. HLS_value_1:
  4302.     cmp    ax,360
  4303.     jle    HLS_value_2
  4304.     sub    ax,360
  4305.     jmp    HLS_value_1
  4306. HLS_value_2:
  4307.     cmp    ax,0
  4308.     jge    HLS_value_3
  4309.     add    ax,360
  4310.     jmp    HLS_value_2
  4311. HLS_value_3:
  4312.     cmp    ax,60
  4313.     jl    HLS_value_4
  4314.     cmp    ax,180
  4315.     jl    HLS_value_5
  4316.     cmp    ax,240
  4317.     jl    HLS_value_6
  4318.     mov    ax,HLS_n1
  4319.     jmp    HLS_value_ex
  4320. HLS_value_5:
  4321.     mov    ax,HLS_n2
  4322.     jmp    HLS_value_ex
  4323. HLS_value_6:
  4324.     mov    bx,ax
  4325.     mov    ax,240
  4326.     sub    ax,bx
  4327. HLS_value_4:
  4328.     mov    bx,ax
  4329.     mov    ax,HLS_n2
  4330.     sub    ax,HLS_n1
  4331.     imul    bx
  4332.     mov    bx,60
  4333.     idiv    bx
  4334.     add    ax,HLS_n1
  4335. HLS_value_ex:
  4336.     pop    dx
  4337.     pop    bx
  4338.     ret
  4339. HLS_value    endp
  4340.  
  4341. HLS_to_RGB    proc    near
  4342. ;
  4343. ;  input  [si]     Hue [0-360]
  4344. ;         [si+2] Lightness [0-100]
  4345. ;         [si+4] Satulation [0-100]
  4346. ;
  4347. ;  output [si]     Red [0-100]
  4348. ;         [si+2] Green [0-100]
  4349. ;      [si+4] Blue [0-100]
  4350. ;
  4351.     push    ax
  4352.     push    bx
  4353.     push    dx
  4354. ;
  4355.     mov    ax,[si+4]        ; get s
  4356.     cmp    ax,0            ; if( s==0 ) then monochrome
  4357.     jne    HLS_to_RGB_1        ; ne=no
  4358.     jmp    HLS_to_RGB_nomo
  4359. HLS_to_RGB_1:
  4360.     mov    bx,[si+2]        ; get l
  4361.     mul    bx            ; dx:ax=l*s  (dx should be 0)
  4362.     mov    bx,100
  4363.     div    bx            ; ax=(l*s)/100
  4364.     cmp    WORD PTR [si+2],50    ; if( l>50 ) then case_2
  4365.     jg    HLS_to_RGB_2
  4366.     mov    bx,[si+2]        ; bx=l
  4367.     jmp    HLS_to_RGB_3
  4368. HLS_to_RGB_2:
  4369.     mov    bx,[si+4]        ; bx=s
  4370.     sub    bx,ax            ; bx=s-l*s/100
  4371.     mov    ax,[si+2]        ; ax=l
  4372. HLS_to_RGB_3:
  4373.     add    ax,bx            ; ax=ax+bx
  4374.     mov    HLS_n2,ax
  4375.     mov    bx,[si+2]        ; bx=l
  4376.     shl    bx,1            ; bx=2*l
  4377.     sub    bx,ax            ; bx=2*l-ax
  4378.     mov    HLS_n1,bx
  4379.     mov    ax,[si]            ; ax=hue
  4380.     push    ax
  4381.     call    HLS_value
  4382.     mov    [si],ax
  4383.     pop    ax
  4384.     push    ax
  4385.     mov    bx,120
  4386.     sub    ax,bx            ; ax=hue-120
  4387.     call    HLS_value
  4388.     mov    [si+2],ax
  4389.     pop    ax
  4390.     mov    bx,120
  4391.     add    ax,bx            ; ax=hue+120
  4392.     call    HLS_value
  4393.     mov    [si+4],ax
  4394.     jmp    HLS_to_RGB_ex
  4395. HLS_to_RGB_nomo:
  4396.     mov    ax,[si+2]
  4397.     mov    [si],ax
  4398.     mov    [si+4],ax
  4399. HLS_to_RGB_ex:
  4400.     pop    dx
  4401.     pop    bx
  4402.     pop    ax
  4403.     ret
  4404. HLS_to_RGB    endp
  4405. ;
  4406. RGB100_to_255    proc    near
  4407. ;
  4408. ; Rescale RGB [0-100] to RGB [0-255]
  4409. ;
  4410. ; Input  [si], [si+2], [si+4]
  4411. ; Output [si], [si+2], [si+4]
  4412. ;
  4413.     push    ax
  4414.     push    bx
  4415.     push    dx
  4416.     mov    bx,655
  4417.     mov    ax,[si]            ; get R
  4418.     mul    bx
  4419.     mov    al,ah
  4420.     xor    ah,ah
  4421.     mov    [si],ax
  4422.     mov    ax,[si+2]        ; G
  4423.     mul    bx
  4424.     mov    al,ah
  4425.     xor    ah,ah
  4426.     mov    [si+2],ax
  4427.     mov    ax,[si+4]        ; B
  4428.     mul    bx
  4429.     mov    al,ah
  4430.     xor    ah,ah
  4431.     mov    [si+4],ax
  4432.     pop    dx
  4433.     pop    bx
  4434.     pop    ax
  4435.     ret
  4436. RGB100_to_255    endp
  4437. ;
  4438. ;-----------------------------------------------------------------------
  4439. ; Set graphic color palette
  4440. ; si: points the color index table (8 colors)
  4441. ;
  4442. set_gpalette    proc    near
  4443.     push    ax
  4444.     push    bx
  4445.     push    cx
  4446. ;
  4447.     cmp    gdisp_mode,0    ; digital display ?
  4448.     jne    set_gpalette_A    ; ne=no.
  4449.     jmp    set_gpalette_D
  4450. ;--------------
  4451. set_gpalette_A:
  4452. ;--------------
  4453.     push    si
  4454.     mov    cx,16
  4455.     mov    bx,0
  4456. set_gpalette_A1:
  4457.     push    cx
  4458.     mov    al,bl
  4459.     out    0A8h,al            ; set color index
  4460.     lodsb
  4461.     mov    cx,4
  4462.     shr    al,cl
  4463.     and    al,0Fh
  4464.     out    0ACh,al            ; set red
  4465.     lodsb
  4466.     mov    cx,4
  4467.     shr    al,cl
  4468.     and    al,0Fh
  4469.     out    0AAh,al            ; set green
  4470.     lodsb
  4471.     mov    cx,4
  4472.     shr    al,cl
  4473.     and    al,0Fh
  4474.     out    0AEh,al            ; set blue
  4475.     pop    cx
  4476.     inc    bx
  4477.     loop    set_gpalette_A1
  4478. ;
  4479.     pop    si
  4480.     jmp    set_gpalette_ex
  4481. ;
  4482. ;--------------
  4483. set_gpalette_D:
  4484. ;--------------
  4485.     push    si
  4486.     add    si,9            ; index #3
  4487.     call    get_dig_color
  4488.     mov    ah,al
  4489.     mov    cl,4
  4490.     shl    ah,cl
  4491.     pop    si
  4492.     push    si
  4493.     add    si,21            ; index #7
  4494.     call    get_dig_color
  4495.     or    al,ah
  4496.     out    0A8h,al            ; set palette #3 and #7
  4497.     pop    si
  4498. ;
  4499.     push    si
  4500.     add    si,3            ; index #1
  4501.     call    get_dig_color
  4502.     mov    ah,al
  4503.     mov    cl,4
  4504.     shl    ah,cl
  4505.     pop    si
  4506.     push    si
  4507.     add    si,15            ; index #5
  4508.     call    get_dig_color
  4509.     or    al,ah
  4510.     out    0AAh,al            ; set palette #1 and #5
  4511.     pop    si
  4512. ;
  4513.     push    si
  4514.     add    si,6            ; index #2
  4515.     call    get_dig_color
  4516.     mov    ah,al
  4517.     mov    cl,4
  4518.     shl    ah,cl
  4519.     pop    si
  4520.     push    si
  4521.     add    si,18            ; index #6
  4522.     call    get_dig_color
  4523.     or    al,ah
  4524.     out    0ACh,al            ; set palette #2 and #6
  4525.     pop    si
  4526. ;
  4527.     push    si
  4528.     call    get_dig_color
  4529.     mov    ah,al
  4530.     mov    cl,4
  4531.     shl    ah,cl
  4532.     pop    si
  4533.     push    si
  4534.     add    si,12
  4535.     call    get_dig_color
  4536.     or    al,ah
  4537.     out    0AEh,al            ; set palette #0 and #4
  4538.     pop    si
  4539. ;
  4540. set_gpalette_ex:
  4541.     pop    cx
  4542.     pop    bx
  4543.     pop    ax
  4544.     ret
  4545. set_gpalette    endp
  4546.  
  4547. set_gtxt_vect    proc    near
  4548.     push    ax
  4549.     push    bx
  4550.     push    cx
  4551.     mov    bx,tek_gtxt_w
  4552.     add    bx,tek_gtxt_s
  4553.     mov    cx,tek_gtxt_h
  4554.     mov    ax,tek_gtxt_ang
  4555.     cmp    ax,45
  4556.     jge    set_gtxt_vect_n1
  4557.     jmp    set_gtxt_vect_1
  4558. set_gtxt_vect_n1:
  4559.     cmp    ax,135
  4560.     jge    set_gtxt_vect_n2
  4561.     jmp    set_gtxt_vect_2
  4562. set_gtxt_vect_n2:
  4563.     cmp    ax,225
  4564.     jge    set_gtxt_vect_n3
  4565.     jmp    set_gtxt_vect_3
  4566. set_gtxt_vect_n3:
  4567.     cmp    ax,315
  4568.     jge    set_gtxt_vect_1
  4569.     jmp    set_gtxt_vect_4
  4570. set_gtxt_vect_1:
  4571.     mov    tek_gtxt_dr,2
  4572.     mov    tek_gtxt_ux,bx
  4573.     mov    tek_gtxt_uy,0
  4574.     mov    tek_gtxt_vx,0
  4575.     mov    tek_gtxt_vy,cx
  4576.     jmp    set_gtxt_vect_5
  4577. set_gtxt_vect_2:
  4578.     neg    cx
  4579.     mov    tek_gtxt_dr,4
  4580.     mov    tek_gtxt_ux,0
  4581.     mov    tek_gtxt_uy,bx
  4582.     mov    tek_gtxt_vx,cx
  4583.     mov    tek_gtxt_vy,0
  4584.     jmp    set_gtxt_vect_5
  4585. set_gtxt_vect_3:
  4586.     neg    bx
  4587.     neg    cx
  4588.     mov    tek_gtxt_dr,6
  4589.     mov    tek_gtxt_ux,bx
  4590.     mov    tek_gtxt_uy,0
  4591.     mov    tek_gtxt_vx,0
  4592.     mov    tek_gtxt_vy,cx
  4593.     jmp    set_gtxt_vect_5
  4594. set_gtxt_vect_4:
  4595.     neg    bx
  4596.     mov    tek_gtxt_dr,0
  4597.     mov    tek_gtxt_ux,0
  4598.     mov    tek_gtxt_uy,bx
  4599.     mov    tek_gtxt_vx,cx
  4600.     mov    tek_gtxt_vy,0
  4601. set_gtxt_vect_5:
  4602.     pop    cx
  4603.     pop    bx
  4604.     pop    ax
  4605.     ret
  4606. set_gtxt_vect    endp
  4607. ;------------------------------------------------------------------------------
  4608. gcsrw    proc    near
  4609. ;
  4610. ; fill CSRW parameters in the buffer [di]
  4611. ;   Inputs
  4612. ;     ax: x position
  4613. ;     bx: y position
  4614. ;     cx: plane offset / 256
  4615. ;     di: buffer address ( to be broken )
  4616. ;   Outputs
  4617. ;     di: next buffer address
  4618. ;
  4619.     push    ax
  4620.     push    bx
  4621.     push    cx
  4622.     mov    byte ptr [di],49h        ; fill CSRW command
  4623.     mov    byte ptr [di+1],3        ; number of parameters
  4624.     push    ax                ; save x value
  4625.     push    cx                ; save plane number
  4626.     mov    cl,4                ; shift counts
  4627.     shr    ax,cl                ; ax = x / 16
  4628.     mov     cx,bx                ; save y value
  4629.     shl    bx,1                ; bx = y * 2
  4630.     shl    bx,1                ; bx = bx * 2 = y * 4
  4631.     add    bx,cx                ; bx = bx + y = y * 5
  4632.     mov    cl,3                ; shift counts
  4633.     shl    bx,cl                ; bx = bx * 8 = y * 40
  4634.     add    ax,bx                ; ax = x / 16 + y * 40
  4635.     mov    byte ptr [di+2],al        ; set EAD_L
  4636.     mov    al,ah                ; discard EAD_L
  4637.     xor    ah,ah                ; clear higher byte
  4638.     pop    bx                ; recall plane offset
  4639.     mov    bl,bh                ; mov to lower byte
  4640.     xor    bh,bh                ; clear higher byte
  4641.     add    ax,bx                ; add plane offset
  4642.     mov    byte ptr [di+3],al        ; set EAD_M
  4643.     mov    al,ah                ; discard EAD_M
  4644.     xor    ah,ah                ; clear higher byte
  4645.     pop    bx                ; recall x
  4646.     and    bx,000fh            ; lower 4 bits of x (dAD)
  4647.     mov    cl,4                ; shift counts
  4648.     shl    bx,cl                ; shift 4 bits
  4649.      add    ax,bx                ; add to EAD_H
  4650.     mov    byte ptr [di+4],al        ; set dAD+EAD_H
  4651.     add    di,5                ; set next pointer
  4652.     pop    cx
  4653.     pop    bx
  4654.     pop    ax
  4655.     ret
  4656. gcsrw    endp
  4657. ;------------------------------------------------------------------------------
  4658. gline    proc    near
  4659. ;
  4660. ;  Draw line from current position to the displacement (AX,BX)
  4661. ;  Inputs:
  4662. ;    ax: delta_x
  4663. ;    bx: delta_y
  4664. ;    di: buffer address
  4665. ;  Outputs:
  4666. ;    di: next buffer address
  4667. ;
  4668.     push    ax
  4669.     push    bx
  4670.     push    cx
  4671.     mov     byte ptr [di],4ch        ; VECTW command
  4672.     mov    byte ptr [di+1],9        ; number of parameters
  4673. ;
  4674. ;   determine direction (cx)
  4675. ;
  4676.     mov    cx,8                ; Line function with dir=0
  4677.     cmp    ax,0                ; if delta_x = 0 then
  4678.     je    gln0                ;   goto gln0
  4679.     jl    gln1                ; else if delta_x < 0 goto gln1
  4680.     jmp    gln2                ; else goto gln2
  4681. gln0:
  4682.     cmp    bx,0                ;
  4683.     jge    gln2                ; if delta_y >= 0 goto gln2
  4684. gln1:
  4685.     neg    ax                ; delta_x = -delta_x
  4686.     neg    bx                ; delta_y = -delta_y
  4687.     add    cx,4                ; dir >= 4
  4688. gln2:
  4689.     cmp    bx,0                ;
  4690.     jg    gln3                ; if delta_y > 0 goto gln3
  4691.     neg    bx                ; delta_y = -delta_y
  4692.     xchg    ax,bx                ;
  4693.     add    cx,2                ; dir >= 2 or 6
  4694. gln3:
  4695.     cmp    ax,bx                ;
  4696.     jl    gln4                ; if delta_x < delta_y goto gln4 
  4697.     inc    cx                ; dir = 1, 3, 5, or 7
  4698.     jmp    gln5
  4699. gln4:
  4700.     xchg    ax,bx
  4701. gln5:
  4702. ;
  4703. ;     end of direction determination.
  4704. ;     ax: abs(d_x)
  4705. ;     bx: abs(d_y)
  4706. ;     cx: line_code + dir
  4707. ;
  4708.     mov    byte ptr [di+2],cl        ; P1 ready
  4709.     mov    word ptr [di+3],ax        ; abs(d_x)
  4710.     mov    cx,bx                ; cx = abs(d_y)
  4711.     add    cx,bx                ; cx = 2*abs(d_y)
  4712.     push    cx                ; save 2*abs(d_y) for later use
  4713.     sub    cx,ax                ; cx = 2*abs(d_y)-abs(d_x)
  4714.     mov    word ptr [di+5],cx        ; send it
  4715.     sub    cx,ax                ; cx = 2*abs(d_y)-2*abs(d_x)
  4716.     mov    word ptr [di+7],cx        ; send it
  4717.     pop    cx                ; recall 2*abs(d_y)
  4718.     mov    word ptr [di+9],cx        ; send it
  4719. ;
  4720.     mov    byte ptr [di+11],6ch        ; VECTE command
  4721.     mov    byte ptr [di+12],0        ; with no parameters
  4722.     add    di,13                ; update address
  4723.     pop    cx
  4724.     pop    bx
  4725.     pop    ax
  4726.     ret
  4727. gline    endp
  4728. ;-----------------------------------
  4729. gdisp_on    proc    near
  4730.     push    ax
  4731.     push    si
  4732.     mov    al,gdisp_mode
  4733.     out    6ah,al
  4734.     mov    si,offset ggdc_on
  4735.     call    send_to_GGDC
  4736.     pop    si
  4737.     pop    ax
  4738.     ret
  4739. gdisp_on    endp
  4740. ;-----------------------------------
  4741. gdisp_off    proc    near
  4742.     push    si
  4743.     mov    si,offset ggdc_off
  4744.     call    send_to_GGDC
  4745.     pop    si
  4746.     ret
  4747. gdisp_off    endp
  4748. ;-----------------------------------
  4749. gcls    proc    near
  4750.     push    ax
  4751.     push    bx
  4752.     push    cx
  4753.     push    di
  4754.     push    si
  4755.     push    es
  4756. ;
  4757.     mov    si,offset ggdc_off        ; off the graphic GDC
  4758.     call    send_to_GGDC
  4759. ;
  4760.     cld                    ; normal direction
  4761.     xor    ch,ch
  4762.     mov    cl,gplane_nums
  4763.     mov    bx,offset gplane_segm    ; GDC segment address
  4764. gcls_1:
  4765.     mov    ax,[bx]                ; get segment
  4766.     mov    es,ax                ; and set it to ES
  4767.     xor    ax,ax                ; store 0
  4768.     mov    di,ax                ; offset address is 0
  4769.     push    cx                ; save counter
  4770.     mov    cx,16000            ; number of words of G-VRAM
  4771.     rep    stosw                ; store it
  4772.     pop    cx                ; remember number of planes
  4773.     add    bx,2                ; next segment address
  4774.     loop    gcls_1
  4775. ;
  4776.     mov    si,offset ggdc_on        ; on the graphic GDC
  4777.     call    send_to_GGDC
  4778. ;
  4779.     pop    es
  4780.     pop    si
  4781.     pop    di
  4782.     pop    cx
  4783.     pop    bx
  4784.     pop    ax
  4785.     ret
  4786. gcls    endp
  4787.  
  4788. code    ends
  4789.     end
  4790.