2000 TITLE Packtor.ASM ; PACKTOR, split screen RTTY/Packet/Amtor program v1.0 ; for MASM/TASM ; by Mats Petersson 920805 ; ; FOSSIL version ;============================================================================ CSEG SEGMENT ASSUME CS:CSEG,DS:CSEG ORG 100h codestrt: jmp begin B EQU DS:BYTE PTR 0 W EQU DS:WORD PTR 0 pag db ? c_crdn dw ? m_crdn dw ? row_lim db ? win_y db ? c_flag db ? bkflag db ? fos_flag db ? cap_seg dw ? cap_offs dw ? f_hand dw ? f_hand2 dw ? color db ? com_port dw ? old_port dw ? bps db ? parity db ? stopb db ? wordlen db ? com_ndx dw ? bps_ndx dw ? par_ndx dw ? stop_ndx dw ? word_ndx dw ? v_buffer db 4000 dup (?) green db 0 blue db 0 red db 0 color_nmb db 0 scr_ofs dw 0B800h stackspace db 32 dup('STACK ') newstack dw 0 cap_flag db 0 bufw_flag db 0 asc_flag db 0 border db 80*2 dup(20h) ;Make border out of spaces b_len equ $-border stripe db 79 dup(20h) ;Make stripe out of spaces s_len equ $-stripe shadow db 79 dup(223) shad_len equ $-shadow hdrtxt1 db ' * * * P A C K T O R * * * ' len1 equ $-hdrtxt1 hdrtxt2 db ' Amateur Radio Terminal Program v1.0 ' len2 equ $-hdrtxt2 time_str db 'Time: ' time_len equ $-time_str ;============================================================================ init PROC NEAR mov fos_flag,0 call read_setup jnc Z100 mov com_port,01H ;If no setup file exists, mov bps,10100000b ;default to COM1,2400,N,8,1 mov parity,00000000b mov stopb,00000000b mov wordlen,00000011b mov com_ndx,0 mov bps_ndx,21 mov par_ndx,0 mov stop_ndx,0 mov word_ndx,9 Z100: call com_xinit ;Initialize com port mov ah,00 ;Set text mode mov al,03 int 10H mov green,20H ;Customize colors mov red,00 mov blue,00 mov color_nmb,2 ;Color reg 2 call set_color mov green,0 mov red,0 mov blue,20H mov color_nmb,3 ;Color reg 3 call set_color call break_dis ;disable Ctrl-Break mov sp,OFFSET newstack ;New stack pointer mov ah,4aH ;Mshrink mov bx,65535/16 ;Bytes left for program int 21H mov ah,48H ;Malloc mov bx,65535/16 int 21H mov cap_seg,ax ;Pointer to allocated segment mov cap_offs,0 mov ah,0fH ;Return Video State int 10H mov pag,bh ;Save Active Page mov ah,05H ;Select Page mov al,pag int 10H call clrscr ;Clear screen mov bl,17H ;Attribute (foreground & background color) mov cx,b_len ;Length of string mov dh,0 ;Row,column mov dl,0 mov si,OFFSET border ;Pointer to string call str_write mov dh,0 mov dl,79 call setcur mov ah,09 mov al,220 ;Endshadow1 mov bh,pag mov bl,07H mov cx,1 int 10H mov dh,1 mov dl,79 call setcur mov ah,09 mov al,219 ;Endshadow2 mov bh,pag mov bl,07H mov cx,1 int 10H mov bl,07H ; Show border undershadow mov cx,shad_len mov dh,2 mov dl,1 mov si,OFFSET shadow call str_write mov bl,17H ;Show middle stripe mov cx,s_len mov dh,18 mov dl,0 mov si,OFFSET stripe call str_write mov dh,18 mov dl,79 call setcur mov ah,09 mov al,220 ;End shadow of border mov bh,pag mov bl,07H mov cx,1 int 10H mov bl,07H ;Show stripe shadow mov cx,shad_len mov dh,19 mov dl,1 mov si,OFFSET shadow call str_write mov bl,1bH ;Show border text 1 mov cx,len1 ;Length of string mov dh,0 mov dl,0 ;Row,column mov si,OFFSET hdrtxt1 ;Pointer to border text call str_write mov bl,1eH ;Show border text 2 mov cx,len2 ;Length of string mov dh,1 mov dl,0 ;Row,column mov si,OFFSET hdrtxt2 ;Pointer to border text call str_write mov bl,1eH ;Display "Time: " text mov cx,time_len ;Length of string mov dh,0 mov dl,67 ;Row,column mov si,OFFSET time_str ;Pointer to text call str_write mov c_crdn,1400h ;Initialize cursor positions mov m_crdn,0300h init ENDP ;--------------------------------------------------------------------------- main: mov dx,c_crdn ;Place cursor in output window call setcur ;while nothing happens mov ah,01H ; Test Keyboard input status int 16H jz Z101 call which_key Z101: call modem_inp ; No char, test COM4 port instead call clock_rout ; Check time for update of time string jmp main which_key PROC NEAR mov ah,00H ; Get next character in keyboard buffer int 16H xchg ax,dx mov ah,12H ; Get extended shift status int 16H test ah,2 ; Alt key pressed? jz Z102 call altkeys ret Z102: xchg ax,dx cmp al,0 jne Z103 cmp ah,59 jl Z103 cmp ah,68 jg Z103 call fk_out ret Z103: cmp al,0dh ; CR? jne Z104 xor c_flag,1 ; Set flag if CR comes from keyboard ; (should be treated as a CR/LF sequence) Z104: call sendch ret which_key ENDP sendch PROC NEAR push ax mov row_lim,24 mov win_y,20 mov dx,c_crdn ; Use output coordinates call write ; Write character to screen mov c_crdn,dx ; Update coordinates mov c_flag,0 pop ax modem_out: mov dx,com_port ; Send character to Com port mov ah,01H int 14H call modem_inp ret sendch ENDP ;------------------------------------------------------------------------- quitprmpt db 'Are you sure you want to Quit (y,N)? $' quit_string db 'Thanks for using PACKTOR.',13,10,'$' quit PROC NEAR call hidecur call getscr mov color,04fH call capwin mov dh,12 mov dl,20 call setcur mov ah,09H mov dx,OFFSET quitprmpt int 21H rep1: mov ah,01 int 16H jz rep1 mov ah,00H int 16H ;Get character cmp ah,21 ;Scancode 21? (y/Y) je quit_ok call putscr ;No, back to program call showcur ret quit_ok: call clrscr push es mov es,cap_seg ;Mfree mov ah,49H int 21H pop es cmp fos_flag,1 jne Z105 mov dx,com_port ;Deinstall FOSSIL mov ah,05H int 14H Z105: call break_ena ;Restore Ctrl-break interrupt mov ah,0 ;Set text mode mov al,3 int 10H mov dh,1 mov dl,0 call setcur mov ah,09H mov dx,OFFSET quit_string int 21H call showcur mov ax,4C00h ; Exit with no error int 21H ; Back to DOS quit ENDP ;-------------------------------------------------------------------------- modem_inp PROC NEAR mov dx,com_port ;get status of com port mov ah,03H int 14H test ah,1 ; Test if Data Ready jnz Z106 ret ; No,return Z106: mov dx,com_port mov ah,02H ; read character int 14H test cap_flag,1 jz Z107 push es mov es,cap_seg mov bp,cap_offs mov es:b[bp],al inc bp mov cap_offs,bp pop es cmp cap_offs,65035 jnae Z107 test bufw_flag,1 jnz Z107 call buf_warn ret Z107: mov row_lim,17 ; Set row limit and upper y value mov win_y,3 mov dx,m_crdn ;Use input cursor call write mov m_crdn,dx ; Update input cursor values ret modem 2000 _inp ENDP write PROC NEAR cmp al,07FH jbe no_special cmp al,086H ;† je outchar cmp al,08fH ; je outchar cmp al,084H ;„ je outchar cmp al,08EH ;Ž je outchar cmp al,094H ;” je outchar cmp al,099H ;™ je outchar no_special: cmp al,32 jae outchar cmp al,0dH ;If CR, place cursor column 0 jne Z109 test c_flag,1 ;If CR comes from terminal,go 1 row down jz Z108 ;as if a CR/LF sequence together jmp incrow Z108: jmp carriage Z109: cmp al,0aH ;If LF, go down one row jne Z110 jmp incrow Z110: cmp al,08H ;If BS, take appropriate action jne Z111 jmp bkspace cmp al,07H jne Z111 jmp outchar Z111: ret outchar: call setcur mov ah,0aH ;Write character to screen mov bh,pag ;Page number mov cx,1 ;Number of characters int 10H inc dl ;Advance cursor one column call setcur cmp dl,80 ;Column >80? je incrow ret bkspace: mov bkflag,1 curleft: dec dl ;Column -1 cmp dl,0 jge Z112 inc dl ;If column<0 set column=0 Z112: call setcur cmp bkflag,1 je blank ret blank: mov ah,0ah ;Blank out character with space mov al,20h mov bh,pag ;Page number mov cx,1 ;Number of characters int 10H mov bkflag,0 ret incrow: inc dh ;Increment row carriage: mov dl,0 ;Set column to 0 call setcur cmp dh,row_lim ;Cursor at row>24? jg scroll ;Yes, scroll window ret scroll: push dx push bp mov ah,06 ;Clear screen,1 line blanked mov al,1 mov bh,07H ;Attribute mov ch,win_y ;row (y) of upper left corner (save border!) mov cl,0 ;column (x) upper left corner mov dh,row_lim ;row (y) lower right corner mov dl,79 ;column(x) lower right corner int 10H pop bp pop dx mov dh,row_lim ;Put back row to where it should be... mov dl,0 ;And column 0 call setcur ret write ENDP ;------------------------------------------------------------------------- altkeys PROC NEAR xchg ax,dx cmp ah,104 ; check for Function keys jb Z113 cmp ah,113 jg Z120 call fkeys ret Z113: cmp ah,35 ; Alt-H scancode 0;35 (Help) jne Z114 call help ret Z114: cmp ah,36 ; Alt-J scancode 0;36 (Jump to DOS) jne Z115 call dosjump ret Z115: cmp ah,22 ;Alt-U 0;22 (Upload ASCII File) jne Z116 call ascii_ul ret Z116: cmp ah,50 ;Alt-M 0;50 (Set Comms parameters) jne Z117 call comm_set ret Z117: cmp ah,38 ;Alt-L 0;38 (Capture toggle) jne Z118 call capture ret Z118: cmp ah,45 ;Alt-X 0;45 (Exit program) jne Z119 call quit ret Z119: cmp ah,31 ;Alt-S 0;31 (Save setup) jne Z120 call save_setup Z120: ret altkeys ENDP ;--------------------------------------------------------------------------- helpscr db ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' hlplen db ' ³ <<< HELP SCREEN >>> ³ ' db ' ³ ³ ' db ' ³ ³ ' db ' ³ ³ ' db ' ³ Alt-M Set Comms Parameters ³ ' db ' ³ ³ ' db ' ³ Alt-L Capture buffer On/Off ³ ' db ' ³ ³ ' db ' ³ Alt F1- ³ ' db ' ³ Alt F10 Define Function Keys ³ ' db ' ³ ³ ' db ' ³ Alt-U Send ASCII File Alt-S Save Setup ³ ' db ' ³ ³ ' db ' ³ Alt-J Jump to DOS Alt-X Quit Program ³ ' db ' ³ ³ ' db ' ³ ³ ' db ' ³ ³ ' db ' ³ ESC - Exit Help Screen ³ ' db ' ³ ³ ' db ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ' capbox db ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' caplen db ' ³ ³ ' db ' ³ ³ ' db ' ³ ³ ' db ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ' fkbox db ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' fklen db ' ³ ³ ' db ' ³ ³ ' db ' ³ ³ ' db ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ' combox db ' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ' comlen db ' ³ COMMS PARAMETERS ³ ' db ' ³ ³ ' db ' ³ ³ ' db ' ³ (C)OM Port : ³ ' db ' ³ ³ ' db ' ³ (B)aud Rate : ³ ' db ' ³ ³ ' db ' ³ (P)arity : ³ ' db ' ³ ³ ' db ' ³ (S)top Bits : ³ ' db ' ³ ³ ' db ' ³ (W)ord Length : ³ ' db ' ³ ³ ' db ' ³ ³ ' db ' ³ ESC - Exit without save CR - Exit with save ³ ' db ' ³ ³ ' db ' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ' ;----------------------------------------------------------------------------- help PROC NEAR call hidecur call getscr mov dh,2 mov dl,2 mov si,OFFSET helpscr mov cx,21 hlplp: push cx mov bl,6eH mov cx,OFFSET hlplen - OFFSET helpscr call str_write inc dh add si,OFFSET hlplen - OFFSET helpscr pop cx loop hlplp Z121: mov ah,01H ;Check keystroke buffer int 16H jz Z121 mov ah,00 ;Get character int 16H cmp al,27 jne Z121 call putscr call showcur ret help ENDP ;--------------------------------------------------------------------------- capprompt db 'Name of Capture File: $' capfbuf db 31,0 capfname db 31 dup (0) capclosed db 'CAPTURE FILE CLOSED$' striptext db 'Capture On$' stripclr db ' $' capture PROC NEAR xor cap_flag,1 test cap_flag,1 jz capclose call getscr 2000 mov color,05fH call capwin mov dh,12 mov dl,16 call setcur mov ah,09H mov dx,OFFSET capprompt int 21H mov ah,0AH ;Buffered keyboard input mov dx,OFFSET capfbuf int 21H mov bp,OFFSET capfbuf sub dx,dx mov dl,b[bp+1] mov si,dx cmp si,0 jne Z122 xor cap_flag,1 jmp cap_abort Z122: mov b[bp+si+2],0 mov ah,03CH ;Create and open capture file mov cx,00000H ;Normal file mov dx,OFFSET capfname int 21H mov f_hand,ax ;Save file handle call putscr mov dh,18 mov dl,68 call setcur mov bl,09eh mov cx,10 call txt_color mov ah,09H mov dx,OFFSET striptext ;Show message on strip int 21H ret capclose: call getscr mov color,05fH call capwin mov dh,12 mov dl,29 call setcur call hidecur mov ah,09H ;Output message mov dx,OFFSET capclosed int 21H push ds mov ah,040H ;Write buffer to file mov bx,f_hand mov cx,cap_offs mov ds,cap_seg mov dx,00000 int 21H pop ds mov ah,03eH ;Close capture file mov bx,f_hand int 21H mov ah,00H int 16H call showcur cap_abort: mov bp,OFFSET capfname mov cap_offs,00000H mov bufw_flag,0 call putscr mov dh,18 mov dl,68 call setcur mov bl,01eH mov cx,1 call txt_color mov ah,09H mov dx,OFFSET stripclr ;Clear strip int 21H ret capture ENDP bufw_text1 db 'Warning! Only 1000 bytes left in buffer!$' bufw_text2 db ' Time to save...$' buf_warn PROC NEAR mov bufw_flag,1 call getscr call capwin mov dh,11 mov dl,20 call setcur mov ah,09H ;Write warning text mov dx,OFFSET bufw_text1 int 21H mov dh,13 mov dl,20 call setcur mov ah,09H mov dx,OFFSET bufw_text2 int 21H call delay call putscr ret buf_warn ENDP ;-------------------------------------------------------------------------- ascii_text db 'Upload ASCII filename: $' asc_errtext db ' ERROR READING FILE $' ascfbuf db 31,0 ascfname db 31 dup (0) ascinbuf db 0 del_counter dw 0 delay_flag db 0 ascii_ul PROC NEAR call getscr mov color,03fH call capwin mov dh,12 mov dl,16 call setcur mov ah,09H mov dx,OFFSET ascii_text int 21H mov ah,0AH ;Buffered keyboard input mov dx,OFFSET ascfbuf int 21H mov bp,OFFSET ascfbuf mov dx,00000H mov dl,b[bp+1] mov si,dx cmp si,0 ;Abort if null string jne Z123 call putscr jmp ascii_abort Z123: mov b[bp+si+2],0 ;Put a NULL at the end of string mov ax,3D00h ;Open ASCII text file mov dx,OFFSET ascfname int 21H jc ascii_error call putscr mov asc_flag,1 mov f_hand2,ax ;Save file handle asc_to_com: test delay_flag,1 jz nodelay inc del_counter cmp del_counter,0fe0h jae Z124 call modem_inp jmp asc_to_com Z124: mov delay_flag,0 nodelay: mov ah,03fH ;Read file mov bx,f_hand2 mov cx,1 ;1 byte to read mov dx,OFFSET ascinbuf int 21H cmp ax,0 ;EOF? je asc_ready sub ax,ax mov si,OFFSET ascinbuf mov al,b[si] ;Get ASCII character back buffer cmp al,0AH ;Delay at end of line jne Z125 mov del_counter,0 mov delay_flag,1 jmp asc_to_com Z125: mov c_flag,1 call sendch jmp asc_to_com asc_ready: mov ah,03eH ;Close ASCII file mov bx,f_hand2 int 21H ascii_abort: mov asc_flag,0 mov c_flag,0 ret ascii_error: mov dh,12 mov dl,16 call setcur call hidecur mov ah,09H mov dx,OFFSET asc_errtext ;Error message int 21H call delay call putscr call showcur jmp ascii_abort ascii_ul ENDP ;--------------------------------------------------------------------------- f_buffers db 40,0 ;Buffers for function key texts db 40 dup(0) db 40,0 db 40 dup(0) db 40,0 db 40 dup(0) db 40,0 db 40 dup(0) db 40,0 db 40 dup(0) db 40,0 db 40 dup(0) db 40,0 db 40 dup(0) db 40,0 db 40 dup(0) db 40,0 db 40 dup(0) db 40,0 db 40 dup(0) fk_prompt db 'F (E to edit): $' fk_blank db 40 dup(20h),'$' fkeys PROC NEAR push ax call getscr mov color,02eH call fkwin pop ax mov bp,OFFSET f_buffers mov al,ah and ax,0ffh sub al,103 mov bx,OFFSET fk_prompt mov dl,al cmp dl,0aH jne Z126 mov w[bx+1],03031h jmp Z127 Z126: mov dl,al and dl,0fh add dl,030h mov b[bx+1],dl mov b[bx+2],0 Z127: sub al,1 mov dx,42 mul dx add bp,ax mov dh,12 mov dl,7 call setcur mov ah,09H mov dx,OFFSET fk_prompt int 21H call hidecur mov bl,02fH mov cx,40 call txt_color cmp b[bp+2],0 je Z128 mov cx,bp add cx,2 mov ah,09H mov dx,cx int 21H Z128: mov ah,00H int 16H cmp ah,18 ;E scancode je Z129 call showcur jmp fkey_abort Z129: mov dh,12 mov dl,24 call setcur mov ah,09H mov dx,OFFSET fk_blank int 21H mov dh,12 mov dl,24 call setcur call showcur fk_input: mov dl,b[bp+2] push dx mov ah,0AH ;Buffered keyboard input mov dx,bp int 21H sub dx,dx mov dl,b[bp+1] mov si,dx cmp si,0 jne Z130 pop dx mov b[bp+2],dl jmp fkey_abort Z130: mov b[bp+si+2],'$' pop dx fkey_abort: call putscr ret fkeys ENDP ;-------------------------------------------------------------------------- fk_out PROC NEAR mov bp,OFFSET f_buffers mov al,ah and ax,0ffh sub al,59 mov dx,42 mul dx add bp,ax add bp,2 mov si,0 cmp b[bp+si],0 je fkout_ready fkoutlp: mov al,b[bp+si] cmp al,'\' jne Z131 cmp b[bp+si+1],'$' jne Z131 mov al,0dH Z131: push bp push si push cx mov c_flag,1 call sendch pop cx pop si pop bp inc si cmp b[bp+si],'$' je fkout_ready jmp fkoutlp fkout_ready: mov c_flag,0 ret fk_out ENDP ;--------------------------------------------------------------------------- fkwin PROC NEAR mov dh,10 mov dl,3 mov si,OFFSET fkbox mov cx,5 fkwinlp: push cx mov bl,color mov cx,OFFSET fklen - OFFSET fkbox call str_write inc dh add si,OFFSET fklen - OFFSET fkbox pop cx loop fkwinlp ret fkwin ENDP capwin PROC NEAR mov dh,10 mov dl,12 mov si,OFFSET capbox mov cx,5 caplp: push cx mov bl,color mov cx,OFFSET caplen - OFFSET capbox call str_write inc dh add si,OFFSET caplen - OFFSET capbox pop cx loop caplp ret capwin ENDP ;---------------------------------------------------------------------------- ; 010 = 300 baud ; 011 = 600 '' ; 100 = 1200 '' ; 101 = 2400 '' ; 110 = 4800 '' ; 111 = 9600 '' ; 000 = 19200 '' (Replaces old 110 baud mask) ; 001 = 38400 '' (Replaces old 150 baud mask) ; The low order 5 bits can be implemented or not by the FOSSIL, but in all ; cases, if the low order bits of AL are 00011, the result should be that ; the communications device should be set to eight data bits, one stop bit ; and no parity. This setting is a MINIMUM REQUIREMENT of Fido, Opus and ; SEAdog. For purposes of completeness, here are the IBM PC "compatible" ; bit settings: ; Bits 4-3 define parity: 0 0 no parity ; 1 0 no parity ; 0 1 odd parity ; 1 1 even parity ; Bit 2 defines stop bits: 0 1 stop bit; ; 1 1.5 bits for 5- 2000 bit char; ; 2 for others ; Bits 1-0 character length: 0 0 5 bits ; 0 1 6 bits ; 1 0 7 bits ; 1 1 8 bits com_ptr db 'COM1$' dw 0 db 'COM2$' dw 1 db 'COM3$' dw 2 db 'COM4$' dw 3 bps_ptr db '300 $',01000000b db '600 $',01100000b db '1200 $',10000000b db '2400 $',10100000b db '4800 $',11000000b db '9600 $',11100000b db '19200$',00000000b db '38400$',00100000b par_ptr db 'None$',00000000b db 'Even$',00011000b db 'Odd $',00001000b stop_ptr db '1$',00000000b db '2$',00000100b word_ptr db '5$',00000000b db '6$',00000001b db '7$',00000010b db '8$',00000011b comval_save db 4 dup (0) ;Temporary save space for values ;if ESC pressed in menu comm_set PROC NEAR call hidecur call getscr push com_ndx push bps_ndx push par_ndx push stop_ndx push word_ndx push com_port mov bp,OFFSET comval_save mov al,bps mov b[bp],al inc bp mov al,parity mov b[bp],al inc bp mov al,stopb mov b[bp],al inc bp mov al,wordlen mov b[bp],al mov dh,3 mov dl,12 mov si,OFFSET combox mov cx,18 comlp: ;Draw box push cx mov bl,04eH mov cx,OFFSET comlen - OFFSET combox call str_write inc dh add si,OFFSET comlen - OFFSET combox pop cx loop comlp mov bp,OFFSET com_ptr ;Output current values mov si,com_ndx mov dh,7 mov dl,41 call setcur call curcom_out mov bp,OFFSET bps_ptr mov si,bps_ndx mov dh,9 mov dl,41 call setcur call curcom_out mov bp,OFFSET par_ptr mov si,par_ndx mov dh,11 mov dl,41 call setcur call curcom_out mov bp,OFFSET stop_ptr mov si,stop_ndx mov dh,13 mov dl,41 call setcur call curcom_out mov bp,OFFSET word_ptr mov si,word_ndx mov dh,15 mov dl,41 call setcur call curcom_out jmp comset_lp curcom_out: mov bl,04fH mov cx,5 call txt_color newcom_out: add bp,si mov ah,09H mov dx,bp int 21H ret comset_lp: mov ah,00H ;Read key int 16H cmp ah,46 ;Scancode for 'C' key jne bkey mov bp,OFFSET com_ptr mov si,com_ndx add si,7 cmp si,28 jne Z132 sub si,si Z132: mov com_ndx,si mov dh,7 mov dl,41 call setcur call newcom_out mov ax,w[bp+5] mov com_port,ax jmp comset_lp bkey: cmp ah,48 ;'B' scancode jne pkey mov bp,OFFSET bps_ptr mov si,bps_ndx add si,7 cmp si,56 jne Z133 sub si,si Z133: mov bps_ndx,si mov dh,9 mov dl,41 call setcur call newcom_out mov al,b[bp+6] mov bps,al jmp comset_lp pkey: cmp ah,25 ;'P' scancode jne skey mov bp,OFFSET par_ptr mov si,par_ndx add si,6 cmp si,18 jne Z134 sub si,si Z134: mov par_ndx,si mov dh,11 mov dl,41 call setcur call newcom_out mov al,b[bp+5] mov parity,al jmp comset_lp skey: cmp ah,31 ;'S' scancode jne wkey mov bp,OFFSET stop_ptr mov si,stop_ndx add si,3 cmp si,6 jne Z135 sub si,si Z135: mov stop_ndx,si mov dh,13 mov dl,41 call setcur call newcom_out mov al,b[bp+2] mov stopb,al jmp comset_lp wkey: cmp ah,17 ;'W' scancode jne esckey mov bp,OFFSET word_ptr mov si,word_ndx add si,3 cmp si,12 jne Z136 sub si,si Z136: mov word_ndx,si mov dh,15 mov dl,41 call setcur call newcom_out mov al,b[bp+2] mov wordlen,al jmp comset_lp esckey: cmp al,27 jne crkey pop com_port ;Restore old values pop word_ndx pop stop_ndx pop par_ndx pop bps_ndx pop com_ndx mov bp,OFFSET comval_save mov al,b[bp] mov bps,al inc bp mov al,b[bp] mov parity,al inc bp mov al,b[bp] mov stopb,al inc bp mov al,b[bp] mov wordlen,al jmp com_abort ;Don't initialize com port crkey: cmp al,13 je Z137 jmp comset_lp Z137: call com_init add sp,0ch ;Add 10h to SP before returning com_abort: ;We have pushed values on it, remember? call putscr call showcur ret comm_set ENDP ;----------------------------------------------------------------------------- no_comdriv db 13,10,'No FOSSIL/MBBIOS/COMBIOS driver installed! Aborted...',13,10,'$' com_init PROC NEAR cmp fos_flag,1 jne Z138 mov dx,old_port ;Begin with deinstalling FOSSIL mov ah,05H ;on the old com port (if FOSSIL driver used) int 14H com_xinit PROC NEAR mov ah,04H ;And install FOSSIL on the new one mov dx,com_port ;(if FOSSIL driver used...) int 14H ;(Also used to check for any COM driver present) cmp ax,1954H jne Z138 mov fos_flag,1 jmp Z139 Z138: cmp ax,0AA55H ;If not FOSSIL installed, check for MBBIOS/COMBIOS je Z139 mov ah,09H ; If no driver, output error message... mov dx,OFFSET no_comdriv int 21H call delay mov ax,4c00h ; And abort program int 21H Z139: mov ax,com_port ;Save port for later reference mov old_port,ax sub ax,ax ;Clear AX or al,bps ;Set the right bits in AL or al,parity or al,stopb or al,wordlen mov ah,00H ;Initialize COM port mov dx,com_port int 14H ret com_xinit ENDP com_init ENDP ;------------------------------------------------------------------------------ fcb1 db 40 dup (0) fcb2 db 40 dup (0) parmblk dw 0 ; Segment address of environment string dd 0 ; Pointer to command line dd 0 ; Pointer to default FCB to be passed at PSP+5CH dd 0 ; Pointer to default FCB to be passed at PSP+6CH cmdline db 0 com_spc db 'COMSPEC=',0 ;Compare string com_val db 128 dup (0) ;Buffer for COMSPEC value dosjump PROC NEAR call getscr call clrscr push es push ds mov ds,w[02Ch] ;Fetch environment mov si,0 one_more: mov di,OFFSET es:com_spc Z140: ;Compare strings cmpsb je Z140 sub si,1 cmp di,OFFSET es:com_spc+9 ;All characters match? je getval ;Yes, fetch value of COMSPEC next: inc si ;Search for next environmental variable cmp ds:b[si],0 jne next inc si cmp ds:b[si],0 jne one_more getval: movsb cmp ds:b[si-1],0 jne getval pop ds mov bp,OFFSET parmblk mov [bp+2],OFFSET cmdline mov [bp+4],CS mov [bp+6],OFFSET fcb1 mov [bp+8],CS mov [bp+10],OFFSET fcb2 mov [bp+12],CS pop es mov ah,4BH ; EXEC mov al,00H ; Load and Execute mov dx,OFFSET com_val mov bx,OFFSET parmblk int 21H call putscr ret dosjump ENDP ;----------------------------------------------------------------------------- sreadname db 'PACKTOR.SET',0 read_setup PROC NEAR mov ax,3d00h mov dx,OFFSET sreadname int 21H jnc Z141 ret Z141: xchg bx,ax mov ah,03fH ;Read com port number mov cx,2 mov dx,offset com_port int 21H mov ah,03fH ;Read com index mov cx,2 mov dx,offset com_ndx int 21H mov ah,03fH ;Read bps value mov cx,1 mov dx,offset bps int 21H mov ah,03fH ;Read bps index mov cx,2 mov dx,offset bps_ndx int 21H mov ah,03fH ;Read parity value mov cx,1 mov dx,offset parity int 21H mov ah,03fH ;Read parity index mov cx,2 mov dx,offset par_ndx int 21H mov ah,03fH ;Read stopbit value 1c58 mov cx,1 mov dx,offset stopb int 21H mov ah,03fH ;Read stopbit index mov cx,2 mov dx,offset stop_ndx int 21H mov ah,03fH ;Read word value mov cx,1 mov dx,offset wordlen int 21H mov ah,03fH ;Read word index mov cx,2 mov dx,offset word_ndx int 21H mov ah,03fH ;Read fkey buffers mov cx,420 mov dx,OFFSET f_buffers int 21H mov ah,03eH ;Close file int 21H clc ;Clear carry flag ret read_setup ENDP ;---------------------------------------------------------------------------- ssav_prompt db 'Save Setup filename: $' ssavfbuf db 31,0 ssavfname db 31 dup (0) save_setup PROC NEAR call getscr mov color,05fH call capwin mov dh,12 mov dl,16 call setcur mov ah,09H mov dx,OFFSET ssav_prompt int 21H mov ah,0AH ;Buffered keyboard input mov dx,OFFSET ssavfbuf int 21H mov bp,OFFSET ssavfbuf sub dx,dx mov dl,b[bp+1] mov si,dx cmp si,0 jne Z142 jmp ssav_abort Z142: mov b[bp+si+2],0 mov ah,03Ch ;Create and open capture file mov cx,0000H ;Normal file mov dx,OFFSET ssavfname int 21H xchg bx,ax ;Move file handle to BX mov ah,040H mov cx,2 mov dx,offset com_port ;Save port number int 21H mov ah,040H mov cx,2 mov dx,offset com_ndx ;Save com index int 21H mov ah,040H mov cx,1 mov dx,offset bps ;Save bps value int 21H mov ah,040H mov cx,2 mov dx,offset bps_ndx ;Save bps index int 21H mov ah,040H mov cx,1 mov dx,offset parity ;Save parity value int 21H mov ah,040H mov cx,2 mov dx,offset par_ndx ;Save parity index int 21H mov ah,040H mov cx,1 mov dx,offset stopb ;Save stopbit value int 21H mov ah,040H mov cx,2 mov dx,offset stop_ndx ;Save stopbit index int 21H mov ah,040H mov cx,1 mov dx,offset wordlen ;Save wordlen value int 21H mov ah,040H mov cx,2 mov dx,offset word_ndx ;Save wordlen index int 21H mov ah,040H ;Save fkey buffers mov cx,420 mov dx,OFFSET f_buffers int 21H mov ah,03eH ;Close file int 21H ssav_abort: call putscr ret save_setup ENDP ;--------------------------------------------------------------------------- delay PROC NEAR mov cx,-2 delay1: push cx mov cx,20h delay2: loop delay2 pop cx loop delay1 ret delay ENDP tmval_str db 2 dup (0),':',2 dup (0),'$' old_min db 0ffh clock_rout PROC NEAR mov ah,02H ;Read real time clock time int 1aH cmp cl,old_min ;Minutes changed? jne Z143 ret ;No, return Z143: mov old_min,cl mov bp,OFFSET tmval_str mov si,0 mov bl,ch call calc mov bl,cl call calc jmp out_time ;Yes, update time string calc: mov al,bl shr al,1 ;We want the high nibble... shr al,1 shr al,1 shr al,1 and al,0fh add al,30h mov b[bp+si],al ;first character inc si mov al,bl and al,0fh add al,030h mov b[bp+si],al ;second character inc si inc si ;skip over the ':' ret out_time: mov dh,0 mov dl,73 ;Set cursor call setcur mov bl,01eH mov cx,5 call txt_color mov ah,09H mov dx,OFFSET tmval_str int 21H ret clock_rout ENDP ;-------------------------------------------------------------------------- getscr PROC NEAR push es push ds mov ax,cs mov es,ax mov di,OFFSET v_buffer mov ax,scr_ofs mov ds,ax mov si,0 ; lds si,scr_ofs mov cx,4000 getlp: movsb loop getlp pop ds pop es ret getscr ENDP putscr PROC NEAR push es push ds mov ax,scr_ofs mov es,ax mov di,0 ; les di,scr_adr mov ax,cs mov ds,ax mov si,OFFSET v_buffer mov cx,4000 putlp: movsb loop putlp pop ds pop es ret putscr ENDP ;------------------------------------------------------------------------- str_write PROC NEAR push dx push es push si mov ax,scr_ofs mov es,ax mov bp,0 ; les bp,scr_adr sub ax,ax mov al,dh mov dh,160 ;Each row has 160 bytes... mul dh shl dl,1 ;Take attribute bytes in account add al,dl mov di,ax lp: movsb ;First the character... mov es:b[bp+di],bl ;then the attribute byte inc di loop lp pop si pop es pop dx ret str_write ENDP ;------------------------------------------------------------------------- clrscr PROC NEAR ;We take advantage of the automatic mov ah,0fh ;clearing of the screen when setting int 10h ;video mode mov ah,00h int 10h ret clrscr ENDP ;--------------------------------------------------------------------------- hidecur PROC NEAR mov ah,01H ;Hide cursor mov ch,00100110b mov cl,00000111b int 10H ret hidecur ENDP showcur PROC NEAR mov ah,01H ;Hide cursor mov ch,00000110b mov cl,00000111b int 10H ret showcur ENDP setcur PROC NEAR mov ah,02H mov bh,0 int 10H ret setcur ENDP ;------------------------------------------------------------------------- break_adr dd 0000:008Ch ;Cntrl-Break interrupt adress brkadr_save dw 0 brkseg_save dw 0 ascii_val db 20H break_dis PROC NEAR push es les si,break_adr mov dx,es:w[si] ;Save interupt vector mov brkadr_save,dx mov dx,es:w[si+2] mov brkseg_save,dx ;Save interrupt segment mov dx,OFFSET my_break mov es:w[si],dx mov dx,cs mov es:w[si+2],dx pop es ret break_dis ENDP break_ena PROC NEAR push es les si,break_adr mov dx,brkadr_save mov es:w[si],dx ;Retore irq adress mov dx,brkseg_save mov es:w[si+2],dx ;restore irq segment pop es ret break_ena ENDP my_break: iret set_color PROC NEAR mov ah,10h mov al,10h ;Set individual DAC register mov ch,green ;ch=green value mov cl,blue ;cl=blue value mov dh,red ;dh=red value mov bh,00H mov bl,color_nmb ;Color number int 10H ret set_color ENDP txt_color PROC NEAR mov ah,09h mov al,20h ;Set color for text mov bh,0 int 10H ret txt_color ENDP begin: call init call main CSEG ENDS END codestrt . 0