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