;+ This is MSZP98.ASM ; ; Utility and SetUp Package for NEC PC-9801 ; Author: Hirofumi Fujii (KEK On-line group) ; Last Edited: 17-Apr-1990 ; 17-Apr-1991 deleted prn_out ; 05-Apr-1991 added pcwtst ; 30-Sep-1990 added text_scrn ; 27-Sep-1990 VTS comes here ! ; 13-Aug-1990 added sense_sftkey ; 24-Jul-1990 for MS-Kermit v3.02 include mssdef.h include msxp98.h public vts public s2jis, jis2s, is_kanji1 public set_keydef, reset_keydef public set_cursor public sense_sftkey public text_scrn public pc98_bell public pcwait, pcwtst data segment public 'data' ;------------------------------------------------------------------- ; Data for set-up routine ;------------------------------------------------------------------- extrn flags:byte extrn comand:byte ; in MSSCMD.ASM extrn denyflg:word extrn cpu_clock:byte, vtgrph_flg:byte, vttest_flg:byte extrn curkey_mode:byte, keypad_mode:byte extrn display_mode:byte extrn keyin_dos:byte extrn kanji_rcode:byte, kanji_scode:byte extrn vt100_cursr:byte extrn vt100_flags:byte, vt100_pflag:byte extrn vt100_lflag:byte, vt100_gflag:byte extrn def_color:byte, scn_color:byte pcwcnt dw 480 ; wait count pcwtst_vect dw 0, 0, 0, 0 pcwtst_done dw 0 param_dst dw ? temp dw ? vthlp db ' one of the following:',cr,lf db ' Terminal types of: None, VT102, or ' db 'Tek4014',cr,lf db ' Clock (5MHz,8MHz,10MHz) ',cr,lf db ' Keyclick (on/off) ' db ' Keyinput (BIOS/CON/DOS) ',cr,lf db ' Keypad-mode (application/normal) ' db ' Cursorkey-mode (application/normal)',cr,lf db ' Foreground (white,yellow...) ' db ' Background (black,blue...) ',cr,lf db ' Highlight (yellow,magenta...) ' db ' Modeline-color (white,green...) ',cr,lf db ' Kanji-code (DEC-code,Shift-JIS,JIS-' db '7, or none)',cr,lf db ' Insert-mode (on/off) ' db ' Origin-mode (on/off) ',cr,lf db ' Newline-mode (on/off) ' db ' Wrap (on/off) ',cr,lf db ' Cooked-log (on/off) ',cr db '$' ; VT setup command table ; The higher byte indicates the group of the command. ; 100H -- terminal type ; 300H -- color group ; 400H -- Kanji group ; 500H -- Keymode application/normal ; 600H -- Playback file ; 700H -- clear ; 2000H -- vt100_flags on/off ; 2100H -- vt100_pflag on/off ; 2200H -- vtgrph_flg on/off ; 2300H -- vt100_lflag on/off ; 2400H -- vttest_flg on/off ; ; <<< DO NOT forget to update the number of items at 'vttbl' when you add ; new item to the following list >>> vttbl db 36 mkeyw 'Background',301H mkeyw 'Clear-screen',700H mkeyw 'Clock',503H mkeyw 'Color',300H mkeyw 'Cooked-log',LOGCOOK_BIT+2300H mkeyw 'Cursorkey-mode',502H mkeyw 'Display-mode',504H mkeyw 'Exit-graphic',EXITG_BIT+2200H mkeyw 'Foreground',300H mkeyw 'GWait',GCLRWAIT_BIT+2200H mkeyw 'Highlight',302H mkeyw 'Insert-mode',INSERT_BIT+2000H mkeyw 'Kanji-Code',400H mkeyw 'Keyclick',KEYCLICK_BIT+2000H mkeyw 'Keyinput',500H mkeyw 'Keypad-mode',501H mkeyw 'Modeline-color',303H mkeyw 'Mouse',MOUSE_BIT+2200H mkeyw 'Newline-mode',NEWLINE_BIT+2000H mkeyw 'None',ttgenrc+100H ; note 100H flag for decoding here mkeyw 'Origin-mode',ORIGIN_BIT+2000H mkeyw 'Playback',600H mkeyw 'PrintEXT',PRINTEXT_BIT+2100H mkeyw 'PrintFF',PRINTFF_BIT+2100H mkeyw 'Tek4014',tttek+100H mkeyw 'test1',2401H mkeyw 'test2',2402H mkeyw 'test3',2404H mkeyw 'test4',2408H mkeyw 'test5',2410H mkeyw 'test6',2420H mkeyw 'test7',2440H mkeyw 'test8',2480H mkeyw 'VT102',ttvt100+100H mkeyw 'VT52',ttvt52+100H mkeyw 'Wrap',AUTOWRAP_BIT+2000H ; <<< DO NOT forget to update the number of items at 'vttbl' when you add ; new item to the above list >>> ontab db 2 mkeyw 'off',0 mkeyw 'on',1 colortab db 8 mkeyw 'black',0 mkeyw 'blue',1 mkeyw 'cyan',5 mkeyw 'green',4 mkeyw 'magenta',3 mkeyw 'red',2 mkeyw 'white',7 mkeyw 'yellow',6 disatab db 2 ; Tek disable/enable table mkeyw 'disable',1 mkeyw 'enable',0 kanjitab db 4 mkeyw 'DEC-code',KNJCODE_DEC mkeyw 'JIS-7',KNJCODE_JIS7 mkeyw 'None',KNJCODE_NONE mkeyw 'Shift-JIS',KNJCODE_SJIS keyintab db 4 mkeyw 'BIOS',0 mkeyw 'CON',1 mkeyw 'direct',0 mkeyw 'DOS',2 keypadtab db 2 mkeyw 'Application',1 mkeyw 'normal',0 clocktab db 3 mkeyw '10MHz',CPU_5M_CLOCK mkeyw '5MHz',CPU_5M_CLOCK mkeyw '8MHz',CPU_8M_CLOCK displaytab db 2 mkeyw 'Analogue',1 mkeyw 'Digital',0 ; ;--------------------------------------------------------------------------- ; Function key definition tables ker_keydef db 0FEh,'f 01 ',0FFh,062h, 8 dup (0) ; f 1 db 0FEh,'f 02 ',0FFh,063h, 8 dup (0) ; f 2 db 0FEh,'f 03 ',0FFh,064h, 8 dup (0) ; f 3 db 0FEh,'f 04 ',0FFh,065h, 8 dup (0) ; f 4 db 0FEh,'f 05 ',0FFh,066h, 8 dup (0) ; f 5 db 0FEh,'f 06 ',0FFh,067h, 8 dup (0) ; f 6 db 0FEh,'f 07 ',0FFh,068h, 8 dup (0) ; f 7 db 0FEh,'f 08 ',0FFh,069h, 8 dup (0) ; f 8 db 0FEh,'f 09 ',0FFh,06Ah, 8 dup (0) ; f 9 db 0FEh,'f 10 ',0FFh,06Bh, 8 dup (0) ; f10 db 0FEh,'F 01 ',0FFh,082h, 8 dup (0) ; shift f 1 db 0FEh,'F 02 ',0FFh,083h, 8 dup (0) ; shift f 2 db 0FEh,'F 03 ',0FFh,084h, 8 dup (0) ; shift f 3 db 0FEh,'F 04 ',0FFh,085h, 8 dup (0) ; shift f 4 db 0FEh,'F 05 ',0FFh,086h, 8 dup (0) ; shift f 5 db 0FEh,'F 06 ',0FFh,087h, 8 dup (0) ; shift f 6 db 0FEh,'F 07 ',0FFh,088h, 8 dup (0) ; shift f 7 db 0FEh,'F 08 ',0FFh,089h, 8 dup (0) ; shift f 8 db 0FEh,'F 09 ',0FFh,08Ah, 8 dup (0) ; shift f 9 db 0FEh,'F 10 ',0FFh,08Bh, 8 dup (0) ; shift f10 db 0FFh,036h, 4 dup (0) ; ROLL UP db 0FFh,037h, 4 dup (0) ; ROLL DOWN db 0FFh,038h, 4 dup (0) ; INS db 0FFh,039h, 4 dup (0) ; DEL db 0FFh,03Ah, 4 dup (0) ; up arrow db 0FFh,03Bh, 4 dup (0) ; left arrow db 0FFh,03Ch, 4 dup (0) ; right arrow db 0FFh,03Dh, 4 dup (0) ; down arrow db 0FFh,03Eh, 4 dup (0) ; HOME CLR db 0FFh,03Fh, 4 dup (0) ; HELP db 0FFh,0AEh, 4 dup (0) ; shift HOME CLR KEYDEF_SIZE = $ - ker_keydef + 2 DOS_keydef db KEYDEF_SIZE dup (?) ; data ends code segment public 'code' assume cs:code,ds:data,es:nothing extrn comnd:near ; in MSSCMD extrn set_cur_color:near ; in MSXP98 extrn vt100_color:near ; in MSYP98 extrn tek4014_color:near ; in MSGP98 ;------------------- is_kanji1 proc near ; ; Check if al is Kanji 1st byte (stc) or not (clc) ; cmp al,81h jb is_kanji1_no cmp al,0FCh ja is_kanji1_no cmp al,9fh jbe is_kanji1_yes cmp al,0E0h jae is_kanji1_yes is_kanji1_no: clc ret is_kanji1_yes: stc ret is_kanji1 endp ;------------------- jis2s proc near ; ; Convert JIS Kanji code in AX to shift-JIS Kanji code ; ah 2nd byte ; al 1st byte ; test al,1 jz jis2s1 add ah,1Fh jmp jis2s2 jis2s1: add ah,7Dh jis2s2: cmp ah,7Fh jb jis2s3 add ah,1 jis2s3: sub al,21h shr al,1 add al,81h cmp al,9Fh jbe jis2s4 add al,40h jis2s4: ret jis2s endp ;------------------- s2jis proc near ; ; Convert Shift JIS Kanji code in AX to JIS Kanji code ; ah 2nd byte ; al 1st byte ; cmp al,9Fh ja s2jis1 sub al,71h jmp s2jis2 s2jis1: sub al,0B1h s2jis2: shl al,1 inc al cmp ah,7Fh jbe s2jis3 dec ah s2jis3: cmp ah,9Eh jb s2jis4 sub ah,7Dh inc al jmp s2jis5 s2jis4: sub ah,1Fh s2jis5: ret s2jis endp set_keydef proc near ; Save MS-DOS key definition table and set new key definition table. ; This is done by calling NEC-PC98 extended bios. push ax push cx push dx mov dx,offset DOS_keydef mov ax,0 mov cl,0Ch int 0DCh mov dx,offset ker_keydef mov ax,0 mov cl,0Dh int 0DCh pop dx pop cx pop ax ret set_keydef endp reset_keydef proc near ; Restore MS-DOS key definition table push ax push cx push dx mov dx,offset DOS_keydef mov ax,0 mov cl,0Dh int 0DCh pop dx pop cx pop ax ret reset_keydef endp ;--------------------------- text_scrn proc near ; ; Text screen on/off control ; ; Input AL: 0 off ; others on ; push ax push bx mov bl,0Ch ; assume off cmp al,0 ; want off ? je text_scrn_1 ; e=yes mov bl,0Dh ; on text_scrn_1: in al,60h ; Read Text GDC status test al,04h ; GDC buffer empty ? jz text_scrn_1 ; z=no mov al,bl out 62h,al ; send command pop bx pop ax ret text_scrn endp ; ;--------------------------- set_cursor proc near ; ; set cursor ; Input AX: cursor attributes ; bit0 0:visible, 1:invisible ; bit1 0:blink, 1:noblink ; bit2 0:block, 1:underline ; push ax push bx mov bx,ax cli set_cursor1: in al,60h ; Read Text GDS status test al,04h ; GDC buffer empty ? jz set_cursor1 ; z = no mov al,4Bh ; CSFORM command out 62h,al ; send command mov al,8Fh ; CS=1, L/R=15 test bx,1 ; cursor off ? jz set_cursor2 ; z = no mov al,0Fh ; CS=0, L/R=15 set_cursor2: out 60h,al ; send P1 parameter mov al,00h ; BD=0, CST=0 test bx,2 ; blink ? jz set_cursor3 ; z = yes. blink cursor mov al,20h ; BD=1, CST=0 set_cursor3: test bx,4 ; underline ? jz set_cursor4 ; z = no. add al,0Eh ; CST=14 set_cursor4: out 60h,al ; send P2 parameter mov al,07Bh ; CFI=15, BL=12 out 60h,al ; send P3 parameter sti pop bx pop ax ret set_cursor endp ;----------------------------------------------------------------------- ; Bell routine ; pc98_bell proc near push ax push cx ; mov al,06h ; bell on out 37h,al mov cx,0D000h ; counter pc98_bell_loop: loop pc98_bell_loop mov al,07h ; bell off out 37h,al ; pop cx pop ax ret pc98_bell endp ;----------------------------------------------------------------------- ; set the pcwcnt used in pcwait. ; pcwtst_int proc near mov pcwtst_done,1 iret pcwtst_int endp pcwtst proc near push ax push bx push cx push si push di push es ; xor ax,ax mov es,ax ; ES = 0 cli ; disable interrupt mov si,28 ; save vector number 7 & 8 mov di,offset pcwtst_vect mov ax,es:[si] mov [di],ax mov ax,es:[si+2] mov [di+2],ax mov ax,es:[si+4] mov [di+4],ax mov ax,es:[si+6] mov [di+6],ax ; mov pcwcnt,0 mov pcwtst_done,0 sti ; enable interrupt mov cx,10 ; 100msec mesurements mov ax,cs mov es,ax mov bx,offset pcwtst_int mov ah,02h ; interval timer function number int 1Ch ; BIOS call ; pcwtst0: cmp pcwtst_done,0 jne pcwtst2 mov cx,100 pcwtst1: sub cx,1 jnz pcwtst1 inc pcwcnt jmp pcwtst0 ; pcwtst2: inc pcwcnt ; add 1 cli xor ax,ax mov es,ax ; ES = 0 mov si,28 ; restore vector 7 & 8 mov di,offset pcwtst_vect mov ax,[di] mov es:[si],ax mov ax,[di+2] mov es:[si+2],ax mov ax,[di+4] mov es:[si+4],ax mov ax,[di+6] mov es:[si+6],ax sti pop es pop di pop si pop cx pop bx pop ax ret pcwtst endp ;----------------------------------------------------------------------- ;; Wait for the # of milliseconds in ax, for non-IBM compatibles. ; inner loop counter (pcwcnt, adjusted by proc pcwtst). pcwait proc near push cx pcwai0: mov cx,pcwcnt ; inner loop counter for 1 ms pcwai1: sub cx,1 ; inner loop takes 20 clock cycles jnz pcwai1 dec ax ; outer loop counter jnz pcwai0 ; wait another millisecond pop cx ret pcwait endp ;----------------------------------------------------------------------- ; Sense shfit-key status ; ; output ; +----+----+----+----+----+----+----+----+ ; AL | -- | -- | -- |CTRL|GRPH|KANA|CAPS|SHFT| ; +----+----+----+----+----+----+----+----+ sense_sftkey proc near mov ah,02h int 18h ret sense_sftkey endp ;---------------------------------- ; VT Setup routine (global routine) ;---------------------------------- VTS PROC NEAR mov ah,cmkey ; Parse another keyword. mov bx,offset vthlp ; Use this help mov dx,offset vttbl ; Use this table call comnd jnc vsetup_n0 ret vsetup_n0: cmp bh,1h ; marker for terminal type? jne vsetup_n1 ; ne = no jmp vsetup_1 vsetup_n1: cmp bh,20h ; set term vt100_flags on/off? jne vsetup_n20 ; ne = no jmp vsetup_20 vsetup_n20: cmp bh,21h ; set term vt100_pflag on/off? jne vsetup_n21 ; ne = no jmp vsetup_20 vsetup_n21: cmp bh,22h ; set term vtgrph_flg on/off jne vsetup_n22 jmp vsetup_20 vsetup_n22: cmp bh,23h ; set term vt100_lflag on/off jne vsetup_n23 jmp vsetup_20 vsetup_n23: cmp bh,24h ; set term vttest_flg on/off jne vsetup_n24 jmp vsetup_20 vsetup_n24: vsetup_n2: cmp bh,3h ; marker for color jne vsetup_n3 ; ne = no jmp vsetup_3 vsetup_n3: cmp bh,4h ; marker for kanji jne vsetup_n4 ; ne = no jmp vsetup_4 vsetup_n4: cmp bh,5 ; marker for keyboard jne vsetup_n5 jmp vsetup_5 vsetup_n5: cmp bh,6 ; marker for playback file jne vsetup_n6 jmp vsetup_6 vsetup_n6: cmp bh,7 jne vsetup_n7 jmp vsetup_7 vsetup_n7: jmp vsetup_ex ; vsetup_1: ; ; The followings are copied from MSYIBM.ASM ; vsetu0: mov byte ptr temp,bl ; set terminal type mov byte ptr temp+1,-1 ; assume no enable/disable Tek cmp bl,tttek ; set term tek? jne vsetu0a ; ne = no mov dx,offset disatab ; disable/enable keyword table xor bx,bx ; help is the table mov comand.cmcr,1 ; allow bare CR's mov ah,cmkey ; get enable/disable keyword call comnd mov comand.cmcr,0 ; no more bare CR's jc vsetu0e ; c = no such keyword mov byte ptr temp+1,bl ; save enable/disable keyword value mov bl,flags.vtflg ; get current terminal type mov byte ptr temp,bl ; and force it here vsetu0a:mov ah,cmeol call comnd ; get a confirm jc vsetu0d ; c = failure vsetu0e:mov bx,temp mov flags.vtflg,bl ; Set the terminal emulation type ;@@ mov tekflg,0 ; clear Tek sub mode cmp bl,tttek ; adjusting Tek? je vsetu0b ; e = yes cmp bh,-1 ; just enable/disable tek? je vsetu0c ; e = no vsetu0b:and denyflg,not tekxflg ; enable Tek cmp bh,1 ; ought we disable? jne vsetu0c ; ne = no or denyflg,tekxflg ; disable Tek vsetu0c:clc ; success vsetu0d:ret vsetup_20: and bh,1Fh mov param_dst,bx mov ah,cmkey mov bx,0 mov dx,offset ontab call comnd jnc vsetup_2_0_1 ret ; bad keyword vsetup_2_0_1: push bx mov ah,cmeol ; get a confirm call comnd jnc vsetup_2_0_2 jmp vsetup_ex2 ; did not get a confirm vsetup_2_0_2: mov ax,param_dst pop bx cmp bl,0 jne vsetup_2_on not al ; ; OFF mode ; cmp ah,0 jne vsetup_2_off1 and vt100_flags,al jmp vsetup_2_2 vsetup_2_off1: cmp ah,1 jne vsetup_2_off2 and vt100_pflag,al jmp vsetup_2_2 vsetup_2_off2: cmp ah,2 jne vsetup_2_off3 and vtgrph_flg,al jmp vsetup_2_2 vsetup_2_off3: cmp ah,3 jne vsetup_2_off4 and vt100_lflag,al jmp vsetup_2_2 vsetup_2_off4: cmp ah,4 jne vsetup_2_off5 and vttest_flg,al vsetup_2_off5: jmp vsetup_2_2 ; ; ON mode ; vsetup_2_on: cmp ah,0 jne vsetup_2_on1 or vt100_flags,al jmp vsetup_2_2 vsetup_2_on1: cmp ah,1 jne vsetup_2_on2 or vt100_pflag,al jmp vsetup_2_2 vsetup_2_on2: cmp ah,2 jne vsetup_2_on3 or vtgrph_flg,al jmp vsetup_2_2 vsetup_2_on3: cmp ah,3 jne vsetup_2_on4 or vt100_lflag,al jmp vsetup_2_2 vsetup_2_on4: cmp ah,4 jne vsetup_2_on5 or vttest_flg,al jmp vsetup_2_2 vsetup_2_on5: vsetup_2_2: ;; jmp rskp clc ret vsetup_3: mov dx,offset def_color xor bh,bh add dx,bx mov param_dst,dx mov ah,cmkey mov bx,0 mov dx,offset colortab call comnd jnc vsetup_3_1 ret ; bad keyword vsetup_3_1: push bx mov ah,cmeol ; get a confirm call comnd jnc vsetup_3_2 jmp vsetup_ex2 ; did not get a confirm vsetup_3_2: pop dx ; get old bx value to dx mov bx,param_dst mov byte ptr [bx],dl push si mov si,offset def_color cmp bx,si ; if foreground color, set modecol also jne vsetup_3_7 mov byte ptr [bx+3],dl vsetup_3_7: call set_cur_color call vt100_color call tek4014_color pop si ;; jmp rskp ret vsetup_4: mov ah,cmkey mov bx,0 mov dx,offset kanjitab call comnd jnc vsetup_4_1 ret ; bad keyword vsetup_4_1: push bx mov ah,cmeol ; get a confirm call comnd jnc vsetup_4_2 jmp vsetup_ex2 ; did not get a confirm vsetup_4_2: pop bx ; get old bx value to dx mov kanji_scode,bl mov kanji_rcode,bl ;; jmp rskp ret vsetup_5: xor bh,bh cmp bx,0 jne vsetup_5n0 mov dx,offset keyin_dos mov param_dst,dx mov dx,offset keyintab jmp vsetup_5do vsetup_5n0: cmp bx,1 jne vsetup_5n1 mov dx,offset keypad_mode mov param_dst,dx mov dx,offset keypadtab jmp vsetup_5do vsetup_5n1: cmp bx,2 jne vsetup_5n2 mov dx,offset curkey_mode mov param_dst,dx mov dx,offset keypadtab jmp vsetup_5do vsetup_5n2: cmp bx,3 jne vsetup_5n3 mov dx,offset cpu_clock mov param_dst,dx mov dx,offset clocktab jmp vsetup_5do vsetup_5n3: cmp bx,4 jne vsetup_5n4 mov dx,offset display_mode mov param_dst,dx mov dx,offset displaytab jmp vsetup_5do vsetup_5n4: ;; jmp rskp ret vsetup_5do: mov ah,cmkey mov bx,0 call comnd jnc vsetup_5do_1 ret vsetup_5do_1: push bx mov ah,cmeol call comnd jnc vsetup_5do_2 jmp vsetup_ex2 vsetup_5do_2: pop dx mov bx,param_dst mov byte ptr [bx],dl ;; jmp rskp ret vsetup_6: ; Set playback filename. Taken from 'setdmp' in MSSSET.ASM ; Puts filename in global string playback_fnam. ; Discared due to device independent module has playback command now. ; mov dx,offset rdbuf ; work area ; mov rdbuf,0 ; clear it ; mov bx,offset playback_hlp ; help message ; mov ah,cmword ; allow paths ; call comnd ; jnc vsetup_6_1 ; ret ;vsetup_6_1: ; mov ah,cmeol ; call comnd ; jnc vsetup_6_2 ; ret ;vsetup_6_2: ; mov dx,offset rdbuf ; assume we will use this text ; call strlen ; filename given? ; mov si,dx ; for strcpy ; cmp cx,0 ; length of user's filename ; jg vsetup_6_3 ; g = filename is given ; mov si,offset playback_defnam ; no name, use default instead ;vsetup_6_3: ; mov di,offset playback_fnam ; copy to globally available loc ; call strcpy ; or vt100_flags,LOOPTEST_BIT ;; jmp rskp ret vsetup_7: ; push bx ; mov ah,cmeol ; call comnd ; jnc vsetup_7_1 ; jmp vsetup_ex2 vsetup_7_1: ; call vtreset ret vsetup_ex: ;; jmp rskp ret vsetup_ex2: pop bx ret VTS ENDP code ends end