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 / ZSYS / SIMTEL20 / ZSIG / WSZ3PAT.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  11KB  |  468 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;                        ;
  3. ;    WSPATCH.ASM                ;
  4. ;                        ;
  5. ;    Patch for Wordstar 3.0 running under    ;
  6. ;    The Echelon 'Z' System.  Modifies    ;
  7. ;    Wordstar to use the current terminal    ;
  8. ;    characteristics defined in Z3TCAP.    ;
  9. ;                        ;
  10. ;    Copyright (c) 1985 by Dennis Wright    ;
  11. ;    and Echelon, Inc.            ;
  12. ;                        ;
  13. ;    Contains selected routines from     ;
  14. ;    ZCPR3's VLIB.                ;
  15. ;                        ;
  16. ;    VLIB is Copyrighted by Richard Conn    ;
  17. ;    and Echelon Inc.            ;
  18. ;                        ;
  19. ;    Note: It may be possable to install    ;
  20. ;    this patch on other versions of Word-    ;
  21. ;    Star if the equates below are changed    ;
  22. ;    to agree with versions' addresses.    ;
  23. ;                        ;
  24. ;        WordStar is a trademark of        ;
  25. ;    MicroPro International Corporation    ;
  26. ;                        ;
  27. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  28. ;
  29.     MACLIB    Z3BASE
  30. ;
  31. ;    WordStar 3.0 USER1 Patch Addresses from Installation manual.
  32. ;
  33. TNAME    EQU    0190H        ; Terminal name (not documented in manual).
  34. HITE    EQU    0248H        ; Number of lines.
  35. WID    EQU    0249H        ; Number of columns.
  36. ERAEOL    EQU    026DH        ; Erase to end of line.
  37. LINDEL    EQU    0274H        ; Delete line.
  38. LININS    EQU    027BH        ; Insert line.
  39. IVON    EQU    0284H        ; Highlighting on.
  40. IVOFF    EQU    028BH        ; Highlighting off.
  41. DELMIS    EQU    02AFH        ; Delay for non-cursor set functions.
  42. TRMINI    EQU    0292H        ; Terminal init string.
  43. TRMUNI    EQU    029BH        ; Terminal de-init string.
  44. UCRPOS    EQU    0264H        ; User cursor positioning routine.
  45. INISUB    EQU    02A4H        ; User init routine.
  46. MORPAT    EQU    02E0H        ; WordStar user patch area.
  47. PBGMEM    EQU    035CH        ; Contains beginning of text buffer address.
  48. OCHAR    EQU    0267H        ; Contains address of WordStar outchr routine.
  49. ;
  50. ;    The following equate is the base address of the patch routines.
  51. ;
  52. PATCH    EQU    7849H        ; Get this address from original PBGMEM.
  53. ;
  54.     ORG    UCRPOS        ; User-patchable cursor positioning routine.
  55.     JMP    XYPOS        ; Use VLIB cursor positioning routine.
  56. ;
  57.     ORG    INISUB        ; User-patchable init subroutine.
  58.     JMP    INIT        ; Use patch init routine.
  59. ;
  60.     ORG    MORPAT        ; WordStar user patch area.
  61. INIT:    LXI    H,Z3ENV        ; Point to 'Z' System environment descriptors.
  62.     LXI    D,80H
  63.     SHLD    ENVPTR        ; Save pointer.
  64.     PUSH    H        ; Save for later.
  65.     DAD    D        ; Displace to Z3TCAP.
  66.     SHLD    VIDPTR        ; Save pointer.
  67.     LHLD    OCHAR        ; Address of WS outchr routine is kept here.
  68.     SHLD    COUT1+1        ; Inline modify patch cout to use WS outchr.
  69.     POP    H        ; Restore env pointer.
  70.     LXI    D,47        ; Offset to Z3TCAP crt select byte.
  71.     DAD    D
  72.     MOV    A,M        ; Get it.
  73.     LXI    D,2        ; Set offset to crt 0 data area.
  74.     ORA    A        ; Crt 0?
  75.     JZ    GETCRT        ; Yes move crt 0 data to WS patch area.
  76.     LXI    D,5        ; No, move crt 1 data.
  77. GETCRT:    DAD    D        ; Offset to selected Z3TCAP crt data area.
  78.     MOV    A,M        ; Get Z3TCAPs terminal width.
  79.     STA    WID        ; Patch WS width.
  80.     INX    H        ; Bump to Z3TCAPs number of lines.
  81.     MOV    A,M        ; Get number of lines.
  82.     STA    HITE        ; Patch WS hite.
  83.     XRA    A        ; Clear following WS patchs.
  84.     STA    LINDEL        ; Line delete
  85.     STA    LININS        ; ..and line insert (we don't support these).
  86.     LHLD    VIDPTR        ; Get Z3TCAP pointer.
  87.     LXI    D,22        ; Offset to CE delay.
  88.     DAD    D
  89.     MOV    A,M        ; Get CE delay.
  90.     STA    DELMIS        ; Patch WS misc delay.
  91.     INX    H
  92.     CALL    VIDSKP        ; Skip past CL string.
  93.     CALL    VIDSKP        ; Skip past CM string.
  94.     LXI    D,ERAEOL    ; Point to WS eol string.
  95.     CALL    FILL        ; Replace with Z3TCAPs eol string.
  96.     LXI    D,IVON        ; Point to WS turn on highlighting.
  97.     CALL    FILL        ; Replace with Z3TCAPs string.
  98.     LXI    D,IVOFF        ; Point to WS turn off highlighting.
  99.     CALL    FILL        ; Replace with Z3TCAPs string.
  100.     LXI    D,TRMINI    ; Point to WS terminal init string.
  101.     CALL    FILL        ; Replace with Z3TCAPs string.
  102.     LXI    D,TRMUNI    ; Point to WS terminal de-init string.
  103.     CALL    FILL        ; Replace with Z3TCAPs string.
  104.     CALL    NAMIT        ; Replace WS terminal name with Z3TCAPs.
  105.     RET            ; We're done.
  106. ;
  107.     ORG    PBGMEM        ; The beginning of the text memory is
  108.     DW    BEGMEM        ; ..moved up to accommidate our patch.
  109. ;
  110.     ORG    PATCH        ; Extended patch area.
  111. NAMIT:    LHLD    VIDPTR        ; Point to Z3TCAPs terminal name
  112.     LXI    D,TNAME        ; ..and WS terminal name.
  113.     MVI    C,16        ; Move our 16 bytes.
  114. NFILL:    MOV    A,M
  115.     STAX    D
  116.     INX    H
  117.     INX    D
  118.     DCR    C
  119.     JNZ    NFILL
  120.     XCHG
  121. NFILL2:    MOV    A,M        ; Pad out the remainder with spaces.
  122.     CPI    0FH        ; Till this.
  123.     RZ
  124.     ORA    A        ; Or zero.
  125.     RZ
  126.     MVI    A,20H
  127.     MOV    M,A
  128.     INX    H
  129.     JMP    NFILL2
  130. ;
  131. ;    This routine moves Z3TCAP data into the WordStar patch area.
  132. ;    Because WordStar requires the number of bytes for each entry
  133. ;    we must count the bytes we patch and place the number at the
  134. ;    beginning of the patch.
  135. ;
  136. FILL:    PUSH    D
  137.     MVI    C,-1        ; Set byte counter.
  138. FIL1:    INX    D
  139.     MOV    A,M        ; Replace WS data with Z3TCAPs.
  140.     STAX    D
  141.     INX    H
  142.     INR    C
  143.     ORA    A        ; Reached end?
  144.     JNZ    FIL1
  145.     POP    D        ; Yes, restore pointer to first byte.
  146.     MOV    A,C        ; Insert number of bytes in string.
  147.     STAX    D
  148.     RET
  149. ;
  150. COUT:    PUSH    H
  151.     PUSH    D
  152. COUT1:    CALL    0000H        ; This is inline modified by the INIT.
  153.     POP    D        ; Routine to call WordStars outchr
  154.     POP    H        ; ..routine.
  155.     RET
  156. ;
  157. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  158. ;
  159. ;    The following routines are from VLIB by Richard Conn.
  160. ;
  161. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  162. ;
  163. ; GOTO XY    (From VLIB)
  164. ;    HL = Row/Col, with Home=0/0
  165. ;    Return with A=0 and Zero Flag Set if not done
  166. ;
  167. XYPOS:    MOV    D,L        ; Swap row & column
  168.     MOV    E,H        ; ..for vlib
  169.     XCHG
  170. GOTOXY:    PUSH    B        ; Save regs
  171.     PUSH    D
  172.     PUSH    H
  173.     LHLD    VIDPTR        ; Pt to environment
  174.     MOV    A,M        ; No terminal?
  175.     CPI    ' '+1
  176.     JC    ERR
  177.     LXI    D,15H        ; Pt to CM delay
  178.     DAD    D
  179.     MOV    A,M        ; Get it
  180.     STA    CMDELAY        ; Save it
  181.     INX    H        ; Pt to CL string
  182.     INX    H
  183.     CALL    VIDSKP        ; Skip CL string
  184.     MOV    A,M        ; Get first char of CM string
  185.     ORA    A        ; If no string, error
  186.     JZ    ERR
  187.     XCHG            ; DE=address of CM string
  188.     POP    H        ; Get coordinates in HL
  189.     PUSH    H
  190.     CALL    GXY        ; Output xy string with delay
  191.     LDA    CMDELAY        ; Pause
  192.     CALL    VIDELAY
  193.     POP    H        ; Done
  194.     POP    D
  195.     POP    B
  196.     XRA    A        ; Return NZ
  197.     DCR    A
  198.     RET
  199. ERR:    POP    H        ; Done
  200.     POP    D
  201.     POP    B
  202.     XRA    A        ; Return Z
  203.     RET
  204. ;
  205. ; GOTOXY    (From VLIB)
  206. ;   On input, H=Row and L=Column to Position To (0,0 is Home)
  207. ;   On input, DE=address of CM string
  208. ;
  209. GXY:    XRA    A        ; Set row/column
  210.     STA    RCORDER        ; Row before column
  211.     STA    RCBASE        ; Add 0 to base
  212. ;
  213. ; Cycle thru string
  214. ;
  215. GXYLOOP:LDAX    D        ; Get next char
  216.     INX    D        ; Pt to next
  217.     ORA    A        ; Done?
  218.     RZ
  219.     CPI    '%'        ; Command?
  220.     JZ    GXYCMD
  221.     CPI    '\'        ; Escape?
  222.     JZ    GXYESC
  223.     CALL    COUT        ; Send char
  224.     JMP    GXYLOOP
  225.  
  226. ;
  227. ; Escape - output following byte literally
  228. ;
  229. GXYESC:    LDAX    D        ; Get next char
  230.     CALL    COUT        ; Output literally
  231.     INX    D        ; Pt to next
  232.     JMP    GXYLOOP
  233. ;
  234. ; Interpret next character as a command character
  235. ;
  236. GXYCMD:    LDAX    D        ; Get command char
  237.     INX    D        ; Pt to next
  238.     CPI    'd'        ; %d
  239.     JZ    GXYOUT1
  240.     CPI    '2'        ; %2
  241.     JZ    GXYOUT2
  242.     CPI    '3'        ; %3
  243.     JZ    GXYOUT3
  244.     CPI    '.'        ; %.
  245.     JZ    GXYOUT4
  246.     CPI    '+'        ; %+v
  247.     JZ    GXYOUT5
  248.     CPI    '>'        ; %>xy
  249.     JZ    GXYGT
  250.     CPI    'r'        ; %r
  251.     JZ    GXYREV
  252.     CPI    'i'        ; %i
  253.     JZ    GXYINC
  254.     CALL    COUT        ; Output char if nothing else
  255.     JMP    GXYLOOP
  256. ;
  257. ; Set row/col home to 0,0
  258. ;
  259. GXYINC:    MVI    A,1        ; Set rcbase to 1
  260.     STA    RCBASE
  261.     JMP    GXYLOOP
  262. ;
  263. ; Reverse order of output to column then row (default is row then column)
  264. ;
  265. GXYREV:    MVI    A,1        ; Set column and row order
  266.     STA    RCORDER
  267.     JMP    GXYLOOP
  268. ;
  269. ; Command: >xy
  270. ;   If value of row/col is greater than x, add y to it
  271. ;
  272. GXYGT:    CALL    GETVAL        ; Get value
  273.     MOV    C,A        ; Save value
  274.     LDAX    D        ; Get value to test
  275.     INX    D        ; Pt to next
  276.     CMP    C        ; If carry, value>x
  277.     JNC    GXYGT1
  278.     LDAX    D        ; Get value to add
  279.     ADD    C
  280.     CALL    PUTVAL        ; Put value back
  281. GXYGT1:    INX    D        ; Pt to next
  282.     JMP    GXYLOOP        ; Resume
  283. ;
  284. ; Command: +n
  285. ;   Add n to next value and output
  286. ;
  287. GXYOUT5:LDAX    D        ; Get value to add
  288.     INX    D        ; Pt to next
  289.     MOV    B,A        ; Save in B
  290.     CALL    GETVAL        ; Get value
  291.     ADD    B        ; Add in B
  292.     CALL    COUT        ; Output value
  293. RCMARK:    LDA    RCORDER        ; Mark output
  294.     ORI    80H
  295.     STA    RCORDER
  296.     JMP    GXYLOOP
  297. ;
  298. ; Command: .
  299. ;   Output next value
  300. ;
  301. GXYOUT4:CALL    GETVAL        ; Get value
  302.     CALL    COUT        ; Output value
  303.     JMP    RCMARK
  304. ;
  305. ; Command: 3
  306. ;   Output next value as 3 decimal digits
  307. ;
  308. GXYOUT3:CALL    GETVAL        ; Get value
  309.     MVI    B,100        ; Output 100's
  310.     MVI    C,1        ; Leading zeroes
  311.     CALL    DIGOUT
  312. GXYOT3:    MVI    B,10        ; Output 10's
  313.     MVI    C,1        ; Leading zeroes
  314. GXYOT2:    CALL    DIGOUT
  315.     ADI    '0'        ; Output 1's
  316.     CALL    COUT
  317.     JMP    RCMARK
  318. ;
  319. ; Command: 2
  320. ;   Output next value as 2 decimal digits
  321. ;
  322. GXYOUT2:CALL    GETVAL        ; Get value
  323.     JMP    GXYOT3
  324. ;
  325. ; Command: d
  326. ;   Output next value as n decimal digits with no leading zeroes
  327. ;
  328. GXYOUT1:CALL    GETVAL        ; Get value
  329.     MVI    B,100        ; Output 100's
  330.     MVI    C,0        ; No leading zeroes
  331.     CALL    DIGOUT
  332.     MVI    B,10        ; Output 10's
  333.     MVI    C,0        ; No leading zeroes
  334.     JMP    GXYOT2
  335. ;
  336. ; Return next value in A
  337. ;
  338. GETVAL:    LDA    RCORDER        ; Get order flag
  339.     ORA    A        ; Already output the first value?
  340.     JM    GETVAL2
  341.     ANI    1        ; Look at lsb
  342.     JZ    GETVALR        ; If 0, row first
  343. GETVALC:LDA    RCBASE        ; Get base offset
  344.     ADD    L        ; Get column
  345.     RET
  346. ;
  347. GETVALR:LDA    RCBASE        ; Get base offset
  348.     ADD    H        ; Get row
  349.     RET
  350. ;
  351. GETVAL2:ANI    1        ; Look at lsb
  352.     JZ    GETVALC
  353.     JMP    GETVALR
  354. ;
  355. ; Store A as next value
  356. ;
  357. PUTVAL:    MOV    C,A        ; Save value
  358.     LDA    RCORDER        ; Get order flag
  359.     ORA    A        ; Already output the first value?
  360.     JM    PUTVAL2
  361.     ANI    1        ; Look at lsb
  362.     JZ    PUTVALR        ; If 0, row first
  363. PUTVALC:MOV    L,C        ; Set column
  364.     RET
  365. ;
  366. PUTVALR:MOV    H,C        ; Set row
  367.     RET
  368. ;
  369. PUTVAL2:ANI    1        ; Look at lsb
  370.     JZ    PUTVALC
  371.     JMP    PUTVALR
  372. ;
  373. ; Output A as decimal digit char
  374. ;   B=Quantity to Subtract from A, C=0 if no leading zero
  375. ;
  376. DIGOUT:    PUSH    D        ; Save DE
  377.     MVI    D,'0'        ; Char
  378. DECOT1:    SUB    B        ; Subtract
  379.     JC    DECOT2
  380.     INR    D        ; Increment char
  381.     JMP    DECOT1
  382. ;
  383. DECOT2:    ADD    B        ; Add back in
  384.     PUSH    PSW        ; Save result
  385.     MOV    A,D        ; Get digit
  386.     CPI    '0'        ; Zero?
  387.     JNZ    DECOT3
  388.     MOV    A,C        ; Get zero flag
  389.     ORA    A        ; 0=no zero
  390.     JZ    DECOT4
  391. DECOT3:    MOV    A,D        ; Get digit
  392.     CALL    COUT        ; Print it
  393. DECOT4:    POP    PSW        ; Get A
  394.     POP    D        ; Restore DE
  395.     RET
  396. ;
  397. ; GXY Buffers
  398. ;
  399. RCORDER:DS    1        ; 0=row/col, else col/row
  400. RCBASE:    DS    1        ; 0=org is 0,0, else org is 1,1
  401. CMDELAY:DS    1        ; Number of milliseconds to delay for CM
  402. ;
  403. ;    VIDELAY pauses for the number of milliseconds indicated by the A
  404. ; register.  VIDELAY assumes a ZCPR3 environment and uses it to determine
  405. ; processor speed.
  406. ;
  407. VIDELAY:PUSH    PSW        ; Save regs
  408.     PUSH    B
  409.     PUSH    D
  410.     PUSH    H
  411.     MOV    C,A        ; Save count in C
  412.     ORA    A        ; No delay?
  413.     JZ    DONE
  414.     LHLD    ENVPTR        ; Pt to environment
  415.     LXI    D,2BH        ; Offset to processor speed
  416.     DAD    D
  417.     MOV    A,M        ; Get processor speed
  418.     ORA    A        ; Zero?
  419.     JNZ    VID1
  420.     MVI    A,4        ; Assume 4 MHz
  421. VID1:    MOV    B,A        ; Processor speed in B
  422. VID2:    PUSH    B        ; Delay 1 ms
  423.     CALL    DELAY
  424.     POP    B
  425.     DCR    C        ; Count down
  426.     JNZ    VID2
  427. DONE:    POP    H        ; Restore regs
  428.     POP    D
  429.     POP    B
  430.     POP    PSW
  431.     RET
  432. ;
  433. ;  Delay 1 ms at Clock speed
  434. ;
  435. DELAY:    CALL    DEL1        ; Delay 1 ms at 1MHz
  436.     DCR    B        ; Count down clock speed
  437.     JNZ    DELAY
  438.     RET
  439. ;
  440. ;  Delay 1 ms at 1MHz
  441. ;
  442. DEL1:    MVI    C,20        ; 20 loops of 51 cycles each ~ 1000 cycles
  443. DEL1A:    XTHL            ; 18 cycles
  444.     XTHL            ; +18 = 36 cycles
  445.     DCR    C        ; + 5 = 41 cycles
  446.     JNZ    DEL1A        ; +10 = 51 cycles
  447.     RET
  448. ;
  449. ;  VIDSKP - Skip over video string pted to by HL; pt to byte after string
  450. ;
  451. VIDSKP:    MOV    A,M        ; Get next char
  452.     INX    H        ; Pt to next
  453.     ORA    A        ; Done if zero
  454.     RZ
  455.     CPI    '\'        ; Literal value?
  456.     JNZ    VIDSKP        ; Continue if not
  457.     INX    H        ; Pt to after literal value
  458.     JMP    VIDSKP
  459. ;
  460. ;  ZCPR3 Pointer save area
  461. ;
  462. VIDPTR:    DS    2        ; First byte of termcap entry
  463. ENVPTR:    DS    2        ; 'Z' System environment package.
  464. ;
  465. BEGMEM    EQU    $
  466. ;
  467.     END
  468.