home *** CD-ROM | disk | FTP | other *** search
-
- TITLE 'BIDIRECT. VERSION SHOW'
-
- ; CP/M-86 translation using XLT86 05/22/83 H.M. Van Tassell
- ; use GENCMD BISHOW 8080 CODE[M240] 64*128+400H OF CODE
-
- ; CHANGED TO USE WYSE-100/200 SCRL KEYS BUT YOU CAN USE ANY
- ; KEYS TO SCROOL JUST MAKE SURE MESSAGES MATCH YOUR CHOICE
- ; ALSO CHECK THAT CLRSCR SEQUENCE WORKS ON YOUR TERMINAL
- ; HI-BIT MASKING ADDED SO WILL PRINT WORDSTAR FILES
- ;
- ; BISHOW.A86
- ;
- ;A buffered, bidirectional version of SHOW.ASM.
- ;Ver 1.0, 23 Aug 82
- ;Phil Cary, 748 Kenilworth Parkway, Baton Rouge, LA 70808
- ;Ver 1.1, 30 Mar 83 added BDOS function 6 W.F.McGee
- ;
- ; Begin code
- ;
- M EQU Byte Ptr 0[BX] ;xlt86 way to make 'M'
- ;
- false EQU 0
- true EQU not false
- ;
- ; BDOS equates
- ;
- boot EQU 0 ;warm boot
- wrcon EQU 2 ;console write
- bdos EQU 5 ;bdos entry
- open EQU 15 ;open file
- readr EQU 33 ;read file random access
- stdma EQU 26 ;set dma address
- ;
- ; FCB equates
- ;
- fcb EQU 05ch ;default fcb drive number
- fcbfn EQU fcb+1 ;start of filename
- fcbft EQU fcb+9 ;start of filetype
- fcbex EQU fcb+12 ;current extent number
- fcbcrr EQU fcb+33 ;current record number, random access
- ;
- ; ASCII equates
- ;
- cr EQU 0dh ;carriage return
- lf EQU 0ah ;line feed
- eof EQU 01ah ;end of file
- esc EQU 01bh ;escape
- bell EQU 07h ;bell
- ;
- ;
- ; Operational equates
- ;
- maxsec EQU 64 ;number of sectors in buffer
- ;
- ORG 100h
- ;
- JMPS start ;skip over next subroutine
- mes0 DB esc,'*','$' ;Wyse-100/200 terminal.
- ;.. change as required
- clrscr: mov dx,offset mes0 ;code to erase screen and home cursor
- call prnstr
- RET
- ;
- start: CALL clrscr ;clear the screen
- CALL opnfil ;open file in default fcb
- XOR AL,AL ;get a 0
- MOV Byte Ptr lincnt,AL ;store in line count
- MOV Byte Ptr .fcbex,AL ;zero current extent
- MOV Byte Ptr .fcbcrr,AL ;zero current record
- MOV Byte Ptr .fcbcrr+1,AL ;..both bytes
- MOV Byte Ptr .fcbcrr+2,AL ;..and the overflow
- CALL filbuf ;fill the disk buffer
- ;
- wrtfwd: MOV BX,(Offset dskbuf) ;point to beginning of buffer
- wrtfwd1:MOV AL,M ;get a character
- CMP AL,eof ;if it is EOF
- JZ getcmd ;..loop for another command
- LAHF ;save character from BDOS clobber
- XCHG AL,AH
- PUSH AX
- XCHG AL,AH
- CALL ctype ;put it on console
- POP AX ;get character
- XCHG AL,AH
- and al,7fh
- CMP AL,cr ;see if end of line
- JZ fwdcnt ;yes, count line
- wrtfwd2:INC BX ;no, bump buffer
- MOV DX,fulbuf ;get end of buffer address
- MOV AL,DH ;compare high
- CMP AL,BH ;..order bytes
- JNZ wrtfwd1 ;if not equal, continue
- MOV AL,DL ;else compare low
- CMP AL,BL ;..order bytes
- JNZ L_1
- CALL filbuf ;if end of buffer, go refill
- L_1:
- JZ wrtfwd ;..and start at beginning of buffer
- JMPS wrtfwd1 ;else, continue with next character
- ;
- fwdcnt:
- MOV AL,Byte Ptr lincnt ;get number of lines displayed
- INC AL ;bump it
- MOV Byte Ptr lincnt,AL ;..and store it
- XCHG BX,DX ;save the buffer pointer
- MOV BX,Offset linmax ;point to max number of line for this pass
- CMP AL,M ;compare with line count
- XCHG BX,DX ;restore pointer
- JNZ wrtfwd2 ;if not there, continue, else get command
- XOR AL,AL ;zero the
- MOV Byte Ptr lincnt,AL ;..line count
- ;
- getcmd:
- PUSH BX
- PUSH DX
- PUSH CX
- getcmd1:
- MOV CL,06
- MOV DL,0FFH
- INT 224
- CMP AL,00h ;char. ready?
- JZ getcmd1
- CMP AL,esc ;skip if esc
- JZ getcmd1
- AND AL,5fH ;make it upper case
- PUSH AX ;save char
- MOV AL,22 ;set up for only 22 lines on forward
- MOV Byte Ptr linmax,AL ;..scrolls
- POP AX ;get char
- POP CX
- POP DX
- POP BX
- CMP AL,'W' ;scroll forward?-WYSE-100 SCRL DOWN
- JE wrtfwd1 ;scroll forward
- CMP AL,'C'-40H ;CTRL C
- JE wrtfwd1 ;scroll forward
- CMP AL,'Z'-40H ;CTRL Z
- JE wrtfwd1 ;scroll forward
- PUSH AX ;else save character again
- MOV AL,24 ;set up for full screen on scroll
- MOV Byte Ptr linmax,AL ;..backward
- POP AX ;get character
- CMP AL,'V' ;scroll backward?-WYSE-100 SCRL UP
- JZ wrtbak ;yes
- CMP AL,'R'-40H ;CTRL R
- JZ wrtbak ;yes
- CMP AL,'W'-40H ;CTRL W
- JZ wrtbak ;yes
- CMP AL,'X' ;must be exit
- JNZ L_3
- JMP exit ;yes, or
- L_3:
- mov dx,offset mes1
- call prnstr
- JMPS getcmd ;try again for command
- ;
- wrtbak: MOV AL,44
- MOV Byte Ptr lincnt,AL
- push bx
- CALL clrscr ;clear the screen
- pop bx
- wrtbak1:MOV DX,(Offset dskbuf) ;get address of buffer start
- MOV AL,DH ;compare high
- CMP AL,BH ;..order bytes
- JNZ wrtbak2 ;continue if not equal
- MOV AL,DL ;else, compare low
- CMP AL,BL ;..order bytes
- JNZ wrtbak2 ;continue if not equal
- JMPS filbak ;..and go write it
- wrtbak2:MOV AL,M ;get a character
- and al,7fh
- CMP AL,cr ;see if end of line
- LAHF ;decrement buffer
- DEC BX
- SAHF
- JNZ wrtbak1 ;..and loop if not
- ;
- bakcnt: MOV AL,Byte Ptr lincnt ;else, get number of lines to move back
- DEC AL ;..and decrement it
- MOV Byte Ptr lincnt,AL ;..store it
- JNZ wrtbak1 ;..and loop if not there
- INC BX ;else bump pointer to account for lf with cr
- JMP wrtfwd1 ;..and go write a screen
- ;
- filbak: MOV DX,maxsec ;get the buffer size
- MOV BX,Word Ptr seccnt ;..and number of sectors last read
- ADD BX,DX ;add them
- XCHG BX,DX ;..and put them in DE
- MOV AL,Byte Ptr .fcbcrr ;subtract low order byte
- SUB AL,DL ;..from current record count
- MOV Byte Ptr .fcbcrr,AL ;..and store in current record count
- MOV AL,Byte Ptr .fcbcrr+1 ;same with high order byte
- SBB AL,DH ;..but with borrow
- JS filbeg ;if beyond beginning of file, go zero count
- MOV Byte Ptr .fcbcrr+1,AL ;else, store high order byte
- CALL filbuf ;fill the buffer
- MOV BX,fulbuf ;..and point to end of buffer
- CALL clrscr ;clear the screen
- JMPS wrtbak2 ;continue moving back in file
- ;
- filbeg: XOR AL,AL ;if beyond beginning of file
- MOV Byte Ptr .fcbcrr,AL ;..zero the current record field
- MOV Byte Ptr .fcbcrr+1,AL
- MOV Byte Ptr lincnt,AL ;..and the line count
- CALL filbuf ;fill the buffer again
- JMP wrtfwd ;..and go write it
- ;
- filbuf: MOV DX,(Offset dskbuf) ;load start of disk buffer
- MOV CH,maxsec ;number of sectors to resd
- MOV BX,0 ;zero out the
- MOV Word Ptr seccnt,BX ;..number of sectors in buffer
- filbuf1:PUSH BX ;save all
- PUSH DX ;..registers from
- PUSH CX ;..BDOS clobber
- MOV CL,stdma ;set dma to
- INT 224 ;..disk buffer
- MOV DX,fcb ;set up to read
- MOV CL,readr ;..a record
- INT 224 ;do it
- CMP AL,0 ;read OK?
- MOV BX,Word Ptr .fcbcrr ;get current record number
- LAHF ;..bump it
- INC BX
- SAHF
- MOV Word Ptr .fcbcrr,BX ;..and save it
- MOV BX,Word Ptr seccnt ;get sectors in buffer
- LAHF ;bump it
- INC BX
- SAHF
- MOV Word Ptr seccnt,BX ;store it
- JNZ rderr ;no, last sector read
- POP CX ;yes, get sector count
- DEC CH ;decrement it
- POP DX ;get de off stack to expose return address
- POP BX ;
- JNZ L_4
- RET ;if done return
- L_4:
- MOV BX,128 ;else, add 128 to
- ADD BX,DX ;..dma address
- XCHG BX,DX ;put it in de
- JMPS filbuf1 ;read another sector
- ;
- rderr: POP CX ;restore
- POP DX ;..registers
- POP BX ;..and
- XOR AL,AL ;..get a zero to direct to start of buffer
- RET ;..on ret
- ;
- opnfil: MOV AL,Byte Ptr .fcbfn ;point to first letter of filename
- CMP AL,' ' ;anything there?
- JZ help ;no, give help message
- MOV DX,fcb ;file name in default fcb
- MOV CL,open ;set up to open
- INT 224 ;do it
- CMP AL,0ffh ;open OK?
- JZ L_5
- RET ;yes
- ;
- L_5: mov dx,offset mes2
- call prnstr
- JMP exit1 ;leave msg on screen on exit
- ;
- help: mov dx,offset mes3
- call prnstr
- JMP exit1
- ;
- prnstr: push bx ;print string
- push cx
- mov cl,9
- int 224
- pop cx
- pop bx
- ret
- ;
- ctype: PUSH CX ;Save the registers
- PUSH DX ;..from bdos
- PUSH BX ;..clobber
- CMP AL,'O'-40H ;wordstar uses ^O
- JNE NOTCO ;as non-break space
- MOV AL,' ' ;..so substitute space
- NOTCO: AND AL,7FH ;strip hi-bit
- MOV DL,AL ;set up character
- MOV CL,wrcon ;..to send to console
- INT 224 ;do it
- POP BX ;restore
- POP DX ;..the registers
- POP CX
- RET
- ;
- exit: CALL clrscr ;clear the screen
- exit1: MOV CL,0 ;warm boot
- MOV DL,0
- INT 224
- L_6 EQU $
- DSEG
- ORG Offset L_6
- ;
- ;
- mes1 DB cr,lf,lf,'Use the SCRL keys (or ^C,^R) to go forward and '
- DB 'backward, or X to exit.',cr,bell,'$'
- ;
- mes2 DB cr,lf,lf,'Requested file is not on this disk.',cr,lf,bell
- DB 'Please check your spelling or use DIR.',cr,lf,lf,bell,'$'
- ;
- mes3 DB 'Correct usage of SHOW',lf,lf
- DB ' A>SHOW filename ',cr,lf,lf
- DB 'After first page is displayed, use SCRL down (^C) to go'
- DB ' forward',cr,lf
- DB 'and SCRL up (^R) for backward, or X to exit.'
- DB cr,lf,lf,bell,'$'
- ;
- ; Memory allocation
- ;
- seccnt DW 0 ;number of sectors read into buffer
- linmax DB 24 ;number of to write lines on console
- lincnt DB 0 ;line number on write or move back in buffer
- dskbuf EQU (Offset $) ;disk buffer area above the program
- fulbuf EQU (Offset dskbuf)+(maxsec*128) ;need to know end of buffer
- ;
- END
-