home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / WSTAR / WS3BLINK.LBR / WSPATCH.AQM / WSPATCH.ASM
Assembly Source File  |  2000-06-30  |  7KB  |  319 lines

  1. FCB        EQU    5CH        ;default file ctrl block
  2. BDOS        EQU    5        ;bdos jump point
  3. DIVERT1        EQU    1D78H        ;diversion from ws console i/p routine
  4. INISUB        EQU    287H        
  5. PATCHSP        EQU    2CBH        ;wordstar free patch area
  6. LF        EQU    0AH
  7. CR        EQU    0DH
  8. ;
  9.                 ORG    100H
  10.         JMP     START
  11. ;
  12. MSG1        DB    1AH,'WSPATCH REV. 1.1',CR,LF
  13.         DB    'INSTALLATION PROGRAM FOR WORDSTAR '
  14.         DB    'PATCHES: ',CR,LF
  15.         DB    '-BLINKING CURSOR',CR,LF
  16.         DB    '-ARROW KEY REDEFINITION',CR,LF
  17.         DB    'FOR OSBORNE CP/M 2.2A-00F '
  18.         DB    '& WORDSTAR VERSION 3.3 ',CR,LF
  19.         DB    LF,LF,'ENTER DESIRED BLINK RATE (0 TO 9)',CR,LF
  20.         DB    '0 IS VERY FAST, 9 IS VERY SLOW',CR,LF
  21.         DB    CR,LF,LF,'BLINK RATE? $'
  22. ;
  23. MSG2        DB    CR,LF,LF,'**** MODIFICATIONS COMPLETED '
  24.         DB     'SUCCESSFULLY ****',CR,LF
  25.         DB    '$'
  26. ;
  27. ;BODY OF PATCHES LOCATED HERE
  28. ;
  29.         ORG    PATCHSP
  30. PATCHST
  31. ;* * * * CURSOR BLINK ROUTINE
  32. ;
  33. PATCH1        CPI 06H            ;is this an i/p from console call?
  34.         JNZ RETRN1        ;no, return to ws
  35.         PUSH H
  36. TIMSET        LXI D,$-$              ;blink rate timer 
  37.                           ;(filled in by install routine)
  38. LOOP3        PUSH D
  39.         CALL $-$          ;BIOS call to get cons status 
  40.                     ;(filled in by install routine)
  41.         POP D
  42.         ORA A
  43.         JNZ RETRN2        ;return to ws if char. ready
  44.         DCR E
  45.         JNZ LOOP3
  46.         DCR D
  47.         JNZ LOOP3        ;decr. timer & loop until ready
  48.         LHLD 0EF5AH        ;get BIOS cursor pointer
  49.         MOV A,M
  50.         XRI 80H            ;toggle cursor (underline on/off)
  51.         MOV M,A
  52.         JMP TIMSET        ;restart timer
  53. ;
  54. RETRN2        LHLD 0EF5AH        ;cursor pointer
  55.         MOV A,M
  56.         ORI 80H            ;turn on cursor before leaving
  57.         MOV M,A
  58.         POP H
  59.         MVI A,06        ;restore 'A' contents
  60. RETRN1        CALL 1777H        ;ws inst. that diversion replaced
  61.         RET
  62. ;
  63. ;* * * * ARROW KEY REDEFINITION ROUTINE
  64. ;
  65. PATCH2        LHLD $-$        ;BIOS arrow key def'n pointer
  66.                     ;(filled in by install routine)
  67.         MVI M,05H        ;^E
  68.         INX H
  69.         MVI M,04H        ;^D
  70.         INX H
  71.         MVI M,18H        ;^X
  72.         INX H
  73.         MVI M,13H        ;^S
  74.         RET
  75. ;
  76. ;FOLLOWING PATCH RESETS CP/M ARROW KEYS
  77. ;
  78. PATCH3        LHLD $-$        ;(filled in by install routine)
  79.         MVI M,0BH        ;^K
  80.         INX H
  81.         MVI M,0CH        ;^L
  82.         INX H
  83.         MVI M,0AH        ;^J
  84.         INX H
  85.         MVI M,08H        ;^H
  86.         RET
  87. PATCHND
  88. ;END OF BODY OF PATCHES
  89. ;
  90. ;START OF PATCH INSERTION ROUTINE
  91. ;
  92. ;* * * * CALCULATE AND INSERT BIOS ADDRESSES
  93. START        LHLD 0001        ;get BIOS start address
  94.         MVI L,7FH        ;offset to arrow key pointer
  95.         SHLD PATCH2+1        ;insert into patch
  96.         SHLD PATCH3+1
  97.         MVI L,06H        ;offset to get console status call
  98.         SHLD LOOP3+2        ;insert into patch
  99. ;
  100. ;* * * * CHECK VALIDITY OF FILENAME
  101.         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 BDOS
  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' message to console
  117.         CALL BDOS
  118.         JMP EXIT
  119. ;
  120. GOODFIL        MVI C,9
  121.         LXI D,MSG1        ;header message to console
  122.         CALL BDOS
  123. ;
  124. RETRY1        MVI C,1
  125.         CALL BDOS        ;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 message to console
  133.         CALL BDOS
  134.         JMP RETRY1
  135. ;
  136. CHECK1        CPI 3AH            ;greater 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 BDOS
  144. ;
  145.         LXI D,FCB
  146.         MVI C,0FH        ;try to open ws file
  147.         CALL BDOS
  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 BDOS
  154.         JMP EXIT
  155. ;
  156. ;* * * * READ WORDSTAR INTO CORE
  157. ;
  158. FILEOK        LXI H,1000H        ;read buffer base adrs
  159. LOOP1        SHLD DMAADRS        ;save it
  160. ;
  161.         MVI A,H
  162.         CPI 0B0H        ;read buffer overflow (over B000h)
  163.         JNZ NOFLOW        ;no: ok
  164. ;
  165.         MVI C,9
  166.         LXI D,ERR3        ;'OVERFLOW ERROR' msg to console
  167.         CALL BDOS
  168.         JMP EXIT
  169. ;
  170. NOFLOW        XCHG
  171.         MVI C,1AH        ;call to set DMA adrs
  172.         CALL BDOS
  173. ;
  174.         MVI C,14H
  175.         LXI D,FCB        ;read a record into read buffer
  176.         CALL BDOS
  177. ;
  178.         ORA A            ;end of file?
  179.         JNZ INSERT        ;yes: insert patches
  180. ;
  181.         LHLD DMAADRS
  182.         LXI D,128
  183.         DAD D            ;inc DMA adr by 128 bytes
  184.         JMP LOOP1        ;read next record
  185. ;
  186. ;* * * * INSERT DIVERSION FOR PATCH1 (BLINK)
  187. ;
  188. INSERT        LXI D,0F00H        ;mod bias (100H = 1000H)
  189.         LXI H,DIVERT1        ;diversion from ws to patch1
  190.         DAD D            ;+bias
  191.         DCX H            ;test for correct version of ws -
  192.         MOV A,M            ;check instruction before
  193.                     ;diversion location
  194.         CPI 00
  195.         JZ CHECK2        ;same version: ok
  196. ;
  197. VERSERR        MVI C,9
  198.         LXI D,ERR4        ;'VERSION ERR' msg to console
  199.         CALL BDOS
  200.         JMP EXIT
  201. ;
  202. CHECK2        DCX H
  203.         MOV A,M
  204.         CPI 01            ;check another byte to be sure
  205.         JNZ VERSERR        ;if error
  206. ;
  207.         INX H
  208.         INX H
  209.         INX H
  210.         LXI B,PATCH1        ;patch start adrs
  211.         MOV M,C            ;insert into ws
  212.         INX H
  213.         MOV M,B
  214. ;
  215. ;* * * * INSERT DIVERSION TO PATCH2
  216. ;
  217.         LXI H,INISUB        ;diversion to patch2
  218.         DAD D            ;+bias
  219.         MVI M,0C3H        ;store jmp at inisub
  220.         INX H
  221.         LXI B,PATCH2        ;patch2 start adrs
  222.         MOV M,C            ;insert into ws
  223.         INX H
  224.         MOV M,B
  225.         INX H
  226.         MVI M,0C3H        ;store jmp at unisub = inisub+3
  227.         INX H
  228.         LXI B,PATCH3        ;patch3 start adrs
  229.         MOV M,C            ;insert into ws
  230.         INX H
  231.         MOV M,B
  232. ;
  233. ;* * * * INSERT BODY OF PATCHES INTO WS FREE PATCH AREA
  234.         LXI H,PATCHSP        ;destination adrs
  235.         DAD D            ;+bias
  236.         XCHG
  237.         LXI H,PATCHSP        ;source adrs
  238.         LXI B,PATCHND-PATCHST    ;byte count
  239. ;byte count above must be 124 (7C hex)
  240. ;
  241.         DB 0EDH,0B0H        ;Z80 'LDIR' block move inst
  242. ;
  243. ;* * * * PREPARE TO WRITE WORDSTAR BACK TO DISK
  244.         LXI H,0100H        ;reset FCB
  245.         SHLD FCB+14
  246.         LXI H,0000
  247.         SHLD FCB+12
  248.         SHLD FCB+32
  249.         SHLD FCB+34
  250. ;
  251.         MVI C,0FH
  252.         LXI D,FCB        ;reset wordstar file
  253.         CALL BDOS
  254.         INR A            ;FF becomes 0 = error
  255.         JZ NOFILE
  256. ;
  257.         LXI H,1000H        ;write buffer st adrs
  258.         SHLD WRTADRS
  259.         XCHG
  260. ;
  261. LOOP2        MVI C,1AH        ;call to set DMA
  262.         CALL BDOS
  263. ;
  264.         MVI C,15H
  265.         LXI D,FCB        ;write one record to disk
  266.         CALL BDOS
  267. ;
  268.         LHLD WRTADRS
  269.         LXI D,128
  270.         DAD D            ;inc DMA adr by 128 bytes
  271.         SHLD WRTADRS
  272.         XCHG
  273.         LHLD DMAADRS        ;if wrtadrs = end of read bfr,
  274.                     ;then all done
  275.         MOV A,L
  276.         CMP E
  277.         JNZ LOOP2        ;if not equal: continue
  278.         MOV A,H
  279.         CMP D
  280.         JNZ LOOP2        ;if not equal: continue
  281. ;
  282.         MVI C,10H
  283.         LXI D,FCB        ;close file
  284.         CALL BDOS
  285. ;
  286.         MVI C,9
  287.         LXI D,MSG2        ; 'TERMINATION MSG' to console
  288.         CALL BDOS
  289. ;
  290. EXIT        JMP 0000        ;cp/m warm start entry
  291. ;
  292. ;* * * * STORAGE AND MESSAGES
  293. ;
  294. DMAADRS        DW     0        ;read bfr pointer
  295. WRTADRS        DW    0        ;write bfr pointer
  296. ;
  297. ERR1        DB    08H,'WRONG! ',8,8,8,8,8,8,8,8,'$'
  298. ERR2        DB    CR,LF,LF,'ERROR: FILE NOT FOUND.'
  299.         DB    'RESTART AND TRY AGAIN!',CR,LF,'$'
  300. ERR3        DB     CR,LF,LF,'ERROR: READ BUFFER OVERFLOW. '
  301.         DB    'BAD SOURCE FILE?',CR,LF,'$'
  302. ERR4        DB    CR,LF,LF,'ERROR: WORDSTAR FILE CORRUPT OR '
  303.         DB    'VERSION IS DIFFERENT',CR,LF,'FROM VERSION '
  304.         DB    'EXPECTED BY PATCH (SEE ABOVE)',CR,LF,'$'
  305. ERR5        DB    1AH,'WSPATCH REV 1.1',CR,LF
  306.         DB    'ERROR: WORDSTAR FILENAME.EXT AND SOURCE '
  307.         DB    'DRIVE MUST',CR,LF
  308.         DB    'BE SPECIFIED IN COMMAND LINE. -EG: ',CR,LF
  309.         DB    ' ',1BH,6CH,'WSPATCH B:WS.COM',1BH,6DH
  310.         DB    ' --TRY AGAIN!',CR,LF,'$'
  311. ERR6        DB    1AH,'WSPATCH REV 1.1',CR,LF
  312.         DB    'ERROR: TWO FILENAMES GIVEN IN COMMAND LINE.'
  313.         DB    CR,LF,'SOURCE FILE MUST BE SAME AS DESTINATION'
  314.         DB    'FILE.',CR,LF,' --TRY AGAIN!',CR,LF,'$'
  315. ;
  316.         DS    64
  317. STACK
  318.         END
  319.