home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / p / wspatch.lbr / WSPATCH.BZK / WSPATCH.BAK
Encoding:
Text File  |  1993-10-25  |  7.1 KB  |  314 lines

  1.  
  2. ;*************************************
  3. ;*                                   *
  4. ;*            "WSPATCH"              *
  5. ;*                                   *
  6. ;*       LEE SWORDY   12/5/82        *
  7. ;*                                   *
  8. ;* Revised by Jim Woolley, FOG Disk  *
  9. ;* Librarian, 9/82             *
  10. ;*                     *
  11. ;*************************************
  12. ;
  13. FCB    EQU 5CH        ; DEFAULT FILE CTRL BLOCK
  14. DIVERT1    EQU 1D33H    ; DIVERSION FROM WS CONSOLE I/P ROUTINE
  15. DIVERT2    EQU 0100H    ; DIVERSION FROM WS START-UP ROUTINE
  16. ;              divert2 will not be used
  17. inisub    equ 02a4h    ; instead use ws inisub location
  18. PATCHSP    EQU 02E0H    ; WORDSTAR FREE PATCH AREA
  19. ;
  20.     ORG 0100H
  21.     JMP START
  22. ;
  23. MSG1    DB 1AH,'          WSPATCH   REV. 1.0',0DH,0AH
  24.     DB 'INSTALLATION PROGRAM FOR WORDSTAR PATCHES:',0DH,0AH
  25.     DB '       -BLINKING CURSOR',0DH,0AH
  26.     DB '       -ARROW KEY RE-DEFINITION',0DH,0AH
  27.     DB 'FOR OSBORNE CP/M 2.2A-00F   &   WORDSTAR 2.26-01D',0DH,0AH,0AH,0AH
  28.     DB 'ENTER DESIRED BLINK RATE (0 TO 9)',0DH,0AH
  29.     DB '0 IS VERY FAST,  9 IS VERY SLOW',0DH,0AH
  30.     DB 0DH,0AH,0AH
  31.     DB '         BLINK RATE ? $'
  32. ;
  33. MSG2    DB 0DH,0AH,0AH,'**** MODIFICATIONS COMPLETED SUCCESSFULLY ****',0DH,0AH
  34.     DB '$'
  35. ;
  36. ; BODY OF PATCHES LOCATED HERE
  37. ;
  38.     ORG PATCHSP
  39. PATCHST
  40. ;******** CURSOR BLINK ROUTINE
  41. ;
  42. PATCH1    CPI 06H        ; IS THIS AN I/P FROM CONSOLE CALL ?
  43.     JNZ RETRN1    ; NO: RETURN TO WS
  44.     PUSH H
  45. TIMSET    LXI D,0000H    ; BLINK RATE TIMR (FILLED IN BY INSTAL ROUTINE)
  46. LOOP3    PUSH D
  47.     CALL 0E506H    ; BIOS CALL TO GET CONS STATUS
  48.     POP D
  49.     ORA A
  50.     JNZ RETRN2    ; RETURN TO WS IF CHAR. READY
  51.     DCR E
  52.     JNZ LOOP3
  53.     DCR D
  54.     JNZ LOOP3    ; DECR. TIMER AND LOOP UNTIL READY
  55.     LHLD 0EF5AH    ; GET BIOS CURSOR POINTER
  56.     MOV A,M
  57.     XRI 80H        ; TOGGLE CURSOR (UNDERLINE ON/OFF)
  58.     MOV M,A
  59.     JMP TIMSET    ; RESTART TIMER
  60. ;
  61. RETRN2    LHLD 0EF5AH    ; CURSOR POINTER
  62.     MOV A,M
  63.     ORI 80H        ; TURN ON CURSOR BEFORE LEAVING
  64.     MOV M,A
  65.     POP H
  66.     MVI A,06    ; RESTORE 'A' CONTENTS
  67. RETRN1    CALL 173FH    ; WS INST. THAT DIVERSION REPLACED
  68.     RET        ; RETURN TO WORDSTAR
  69. ;
  70. ;******** ARROW KEY REDEFINITION ROUTINE
  71. ;
  72. PATCH2    LHLD 0E57FH    ; BIOS ARROW KEY DEF'N POINTER
  73.     MVI M,05H    ; ^E
  74.     INX H
  75.     MVI M,04H    ; ^D
  76.     INX H
  77.     MVI M,18H    ; ^X
  78.     INX H
  79.     MVI M,13H    ; ^S
  80. ;    JMP 2D10H    ; WS INST THAT DIVERSION REPLACED (ALSO RETURN TO WS)
  81.     ret        ; above changed to return
  82. ;
  83. ; following patch resets cp/m arrow keys
  84. ;
  85. patch3    lhld 0e57fh
  86.     mvi m,0bh    ; ^k
  87.     inx h
  88.     mvi m,0ch    ; ^l
  89.     inx h
  90.     mvi m,0ah    ; ^j
  91.     inx h
  92.     mvi m,08h    ; ^h
  93.     ret
  94. PATCHND
  95. ;
  96. ; END OF BODY OF PATCHES
  97. ;
  98. ; START OF PATCH INSERTION ROUTINE
  99. ;
  100. ;**** CHECK VALIDITY OF FILENAME
  101. START    LXI SP,STACK    ; LOCAL STACK
  102.     LDA FCB+1    ; FILENAME GIVEN ?
  103.     CPI 20H
  104.     JNZ ONEFILE    ; YES: OK
  105. ;
  106.     MVI C,9
  107.     LXI D,ERR5    ; 'NO FILE' MESSAGE TO CONSOLE
  108.     CALL 0005
  109.     JMP EXIT
  110. ;
  111. ONEFILE    LDA FCB+17    ; 2 FILENAMES GIVEN ?
  112.     CPI 20H
  113.     JZ GOODFIL    ; NO: OK
  114. ;
  115.     MVI C,9
  116.     LXI D,ERR6    ; 'TWO FILENAME' MSG TO CONSOLE
  117.     CALL 0005
  118.     JMP EXIT
  119. ;
  120. GOODFIL    MVI C,9
  121.     LXI D,MSG1    ; HEADER MESSAGE TO CONSOLE
  122.     CALL 0005    ; AND REQUEST BLINK RATE
  123. ;
  124. RETRY1    MVI C,1
  125.     CALL 0005    ; INPUT BLINK RATE (1 DIGIT 0 TO 9)
  126.     CPI 03H        ; ^C ?
  127.     JZ EXIT        ; YES: ABORT
  128.     CPI 30H        ; LESS THAN ASCII ZERO ?
  129.     JP CHECK1    ; NO: OK
  130. ;
  131. CHERROR    MVI C,9
  132.     LXI D,ERR1    ; VALUE ERROR MSG TO CONSOLE
  133.     CALL 0005
  134.     JMP RETRY1
  135. ;
  136. CHECK1    CPI 3AH        ; GRTR THAN ASCII 9 ?
  137.     JP CHERROR    ; YES: ERROR
  138.     SUI 30H        ; CONVERT TO BCD
  139.     INR A        ; +1
  140.     STA TIMSET+2    ; IMBED VALUE IN PATCH1
  141. ;
  142.     MVI C,0DH    ; RESET DISK DRIVES
  143.     CALL 0005
  144. ;
  145.     LXI D,FCB
  146.     MVI C,0FH    ; TRY TO OPEN WS FILE
  147.     CALL 0005
  148.     INR A        ; FF BECOMES 0 = ERROR
  149.     JNZ FILEOK    ; IF NO ERROR
  150. ;
  151. NOFILE    MVI C,9
  152.     LXI D,ERR2    ; 'FILE NOT FOUND' MSG TO CONSOLE
  153.     CALL 0005
  154.     JMP EXIT
  155. ;
  156. ;**** READ WORDSTAR INTO CORE
  157. FILEOK    LXI H,1000H    ; READ BUFFER BASE ADRS
  158. LOOP1    SHLD DMAADRS    ; SAVE IT
  159. ;
  160.     MVI A,H
  161.     CPI 0B0H    ; READ BUFFER OVERFLOW (OVER B000H) ?
  162.     JNZ NOFLOW    ; NO: OK
  163. ;
  164.     MVI C,9
  165.     LXI D,ERR3    ; 'OVERFLOW ERROR' MSG TO CONS
  166.     CALL 0005
  167.     JMP EXIT
  168. ;
  169. NOFLOW    XCHG
  170.     MVI C,1AH    ; CALL TO ST DMA ADRS
  171.     CALL 0005
  172. ;
  173.     MVI C,14H
  174.     LXI D,FCB    ; READ A RECORD INTO READ BUFFER
  175.     CALL 0005
  176. ;
  177.     ORA A        ; END OF FILE ?
  178.     JNZ INSERT    ; YES: INSERT PATCHES
  179. ;
  180.     LHLD DMAADRS
  181.     LXI D,128
  182.     DAD D        ; INC DMA ADR BY 128 BYTES
  183.     JMP LOOP1    ; READ NEXT RECORD
  184. ;
  185. ;**** INSERT DIVERSION FOR PATCH1 (BLINK)
  186. INSERT    LXI D,0F00H    ; MOD BIAS (100H = 1000H)
  187.     LXI H,DIVERT1    ; DIVERSION FRM WS TO PATCH1
  188.     DAD D        ; +BIAS
  189.     DCX H        ; TEST FOR CORRECT VERSION OF WORDSTAR-
  190.     MOV A,M        ; CHECK INST BEFORE DIVERTION LOCATION.
  191.     CPI 00
  192.     JZ CHECK2    ; SAME VERSION: OK
  193. ;
  194. VERSERR    MVI C,9
  195.     LXI D,ERR4    ; 'VERSION ERR' MSG TO CONS
  196.     CALL 0005
  197.     JMP EXIT
  198. ;
  199. CHECK2    DCX H
  200.     MOV A,M
  201.     CPI 01        ; CHECK ANOTHER BYTE TO BE SURE
  202.     JNZ VERSERR    ; IF ERROR
  203. ;
  204.     INX H
  205.     INX H
  206.     INX H
  207.     LXI B,PATCH1    ; PATCH1 ST ADRS
  208.     MOV M,C        ; INSERT INTO WS
  209.     INX H
  210.     MOV M,B
  211. ;
  212. ;**** INSERT DIVERSION TO PATCH2
  213. ;    LXI H,DIVERT2    ; ADRS OF DIVERSION TO PATCH2
  214.     lxi h,inisub    ; patch2 diversion changed to inisub
  215.     DAD D        ; +BIAS
  216.     mvi m,0c3h    ; store jmp at inisub
  217.     INX H
  218.     LXI B,PATCH2    ; PATCH2 ST ADRS
  219.     MOV M,C        ; INSERT INTO WS
  220.     INX H
  221.     MOV M,B
  222.     inx h
  223.     mvi m,0c3h    ; store jmp at unisub = inisub + 3
  224.     inx h
  225.     lxi b,patch3    ; patch3 st adrs
  226.     mov m,c        ; insert into ws
  227.     inx h
  228.     mov m,b
  229. ;
  230. ;**** INSERT BODY OF patches INTO WS FREE PATCH AREA
  231.     LXI H,PATCHSP    ; DESTINATION ADRS
  232.     DAD D        ; +BIAS
  233.     XCHG
  234.     LXI H,PATCHSP    ; SOURCE ADRS
  235.     LXI B,PATCHND-PATCHST    ; BYTE COUNT
  236. ; byte count above must be < 124 decimal (07ch)
  237. ;
  238.     DB 0EDH,0B0H    ; Z80 'LDIR' BLOCK MOVE INST
  239. ;
  240. ;**** PREPARE TO WRITE WORDSTAR BACK TO DISK
  241.     LXI H,0100    ; RESET FCB
  242.     SHLD FCB+14
  243.     LXI H,0000
  244.     SHLD FCB+12
  245.     SHLD FCB+32
  246.     SHLD FCB+34
  247. ;
  248.     MVI C,0FH
  249.     LXI D,FCB    ; OPEN WORDSTAR FILE
  250.     CALL 0005
  251.     INR A        ; FF BECOMES 0 = ERROR
  252.     JZ NOFILE
  253. ;
  254.     LXI H,1000H    ; WRITE BUFFER ST ADRS
  255.     SHLD WRTADRS
  256.     XCHG
  257. ;
  258. LOOP2    MVI C,1AH    ; CALL TO SET DMA ADRS
  259.     CALL 0005
  260. ;
  261.     MVI C,15H
  262.     LXI D,FCB    ; WRITE ONE RECORD TO DISK
  263.     CALL 0005
  264. ;
  265.     LHLD WRTADRS
  266.     LXI D,128
  267.     DAD D        ; INC DMA ADR BY 128 BYTES
  268.     SHLD WRTADRS
  269.     XCHG
  270.     LHLD DMAADRS    ; IF WRTADRS = END OF READ BFR THEN ALL DONE
  271.     MOV A,L
  272.     CMP E
  273.     JNZ LOOP2    ; IF NOT EQUAL: CONTINUE
  274.     MOV A,H
  275.     CMP D
  276.     JNZ LOOP2    ; IF NOT EQUAL: CONTINUE
  277. ;
  278.     MVI C,10H
  279.     LXI D,FCB    ; CLOSE FILE
  280.     CALL 0005
  281. ;
  282.     MVI C,9
  283.     LXI D,MSG2    ; 'TERMINATION MSG' TO CONS
  284.     CALL 0005
  285. ;
  286. EXIT    JMP 0000    ; CP/M WARM START ENTRY
  287. ;
  288. ;**** STORAGE AND MESSAGES
  289. ;
  290. DMAADRS    DW 0        ; READ BFR POINTER
  291. WRTADRS    DW 0        ; WRITE BFR POINTER
  292. ;
  293. ERR1    DB 08H,'  WRONG!',8,8,8,8,8,8,8,8,'$'
  294. ERR2    DB 0DH,0AH,0AH,'ERROR: FILE NOT FOUND, RESTART AND TRY AGAIN!'
  295.     DB 0DH,0AH,'$'
  296. ERR3    DB 0DH,0AH,0AH,'ERROR: READ BUFFER OVERFLOW, BAD SOURCE FILE ?'
  297.     DB 0DH,0AH,'$'
  298. ERR4    DB 0DH,0AH,0AH,'ERROR: WORDSTAR FILE CORRUPT OR VERSION IS DIFFERENT'
  299.     DB 0DH,0AH,'FROM VERSION EXPECTED BY PATCH (SEE ABOVE)',0DH,0AH,'$'
  300. ERR5    DB 1AH,'     WSPATCH   REV 1.0',0DH,0AH
  301.     DB 'ERROR: WORDSTAR FILENAME.EXT AND SOURCE DRIVE MUST',0DH,0AH
  302.     DB 'BE SPECIFIED IN COMMAND LINE.  --EG:',0DH,0AH
  303.     DB '    ',1BH,6CH,'WSPATCH B:WS.COM',1BH,6DH,'  --TRY AGAIN!',0DH,0AH
  304.     DB '$'
  305. ERR6    DB 1AH,'     WSPATCH   REV 1.0',0DH,0AH
  306.     DB 'ERROR: TWO FILENAMES GIVEN IN COMMAND LINE, SOURCE',0DH,0AH
  307.     DB 'FILE MUST BE SAME AS DESTINATION FILE. --TRY AGAIN!',0DH,0AH,'$'
  308. ;
  309. ; STACK AREA
  310.     DS 64
  311. STACK
  312.     END
  313.  
  314.