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 / WMZ3PAT.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  10KB  |  483 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;                            ;
  3. ;    WMPATCH.ASM                    ;
  4. ;                            ;
  5. ;     Patch for Word-Master 1.07 to use with        ;
  6. ;     the Echelon 'Z' System. This patch causes    ;
  7. ;     WordMaster to use the current terminal        ;
  8. ;     characteristics defined in Z3TCAP.        ;
  9. ;                            ;
  10. ;     Copyright (c) 1985 by Dennis Wright and        ;
  11. ;    Echelon, Inc.                    ;
  12. ;                            ;
  13. ;     Contains selected ZCPR3 VLIB routines.            ;
  14. ;                            ;
  15. ;     VLIB is copyrighted by Richard Conn and        ;
  16. ;     Echelon, Inc.                    ;
  17. ;                            ;
  18. ;     WordMaster is a trademark of MicroPro        ;
  19. ;     International.                    ;
  20. ;                            ;
  21. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  22. ;
  23.     MACLIB    Z3BASE
  24. ;
  25. ;    WordMaster 1.07 Patch Addresses
  26. ;
  27. CLRSCRN    EQU    0180H        ; Clearscreen routine
  28. HITE    EQU    01B9H        ; Number of lines
  29. WID    EQU    01BAH        ; Number of columns
  30. EREOL    EQU    01BBH        ; Erase to end of line
  31. NOVIO    EQU    01BDH        ; No video i/o board
  32. DELCLR    EQU    01C1H        ; Delay after clear screen
  33. DELCUS    EQU    01C1H
  34. DELERE    EQU    01C3H        ; Delay for non-cursor set functions
  35. TCURSOR    EQU    0196H        ; User cursor positioning routine
  36. PBEGMEM    EQU    01B7H        ; Contains beginning of text buffer address
  37. SPEC    EQU    29B8H        ; Get this address from PBEGMEM
  38. OUTCHR    EQU    01EFH        ; Output character routine.
  39. START    EQU    0269H        ; Start of Word-Master Version 1.07
  40. ;
  41.     ORG    100H
  42.     JMP    INIT        ; Goto our init routine
  43. ;
  44.     ORG    CLRSCRN
  45.     CALL    CLS
  46.     LXI    H,0
  47.     JMP    XYPOS        ; Put cursor at 0, 0
  48. ;
  49.     ORG    TCURSOR        ; User-patchable cursor positioning routine.
  50.     JMP    XYPOS        ; Use our own cursor positioning routine.
  51. ;
  52.     ORG    PBEGMEM
  53.     DW    BEGMEM
  54. ;
  55.     ORG    SPEC        ; Added patch area
  56. INIT:    LXI    H,Z3ENV        ; Point to the ZCPR3 environment
  57.     LXI    D,80H
  58.     SHLD    ENVPTR        ; Save pointer
  59.     PUSH    H        ; Save for later
  60.     DAD    D        ; Displace to Z3TCAP
  61.     SHLD    VIDPTR        ; Save pointer
  62.     XRA    A
  63.     LXI    H,DELCLR
  64.     MOV    M,A
  65.     INX    H
  66.     MOV    M,A
  67.     INX    H
  68.     MOV    M,A
  69.     POP    H        ; Restore env pointer
  70.     LXI    D,47        ; Offset to CRT select byte
  71.     DAD    D
  72.     MOV    A,M        ; Get it.
  73.     LXI    D,2
  74.     ORA    A        ; Crt 0?
  75.     JZ    GETCRT        ; Yes move crt 0 data to wm patch area
  76.     LXI    D,5        ; No, move crt 1 data
  77. GETCRT:    DAD    D
  78.     MOV    A,M        ; Get tcap width
  79.     STA    WID        ; Patch wm width
  80.     INX    H
  81.     MOV    A,M        ; Get tcap number of lines
  82.     STA    HITE        ; Patch wm hite
  83.     LHLD    VIDPTR        ; Get tcap pointer
  84.     LXI    D,22        ; Offset to ce delay
  85.     DAD    D
  86.     MOV    A,M        ; Get ce delay
  87.     STA    DELERE        ; Patch wm delay after erase to eol
  88.     INX    H
  89.     CALL    VIDSKP        ; Skip past cl string
  90.     CALL    VIDSKP        ; Skip past cm string
  91.     LXI    D,EREOL        ; Point to wm eol string
  92.     PUSH    H
  93.     MVI    C,-1
  94. CNTEOL:    MOV    A,M        ; Get tcap byte count for eol
  95.     INX    H
  96.     INR    C
  97.     ORA    A
  98.     JNZ    CNTEOL
  99.     POP    H
  100.     MOV    A,C
  101.     CPI    3        ; More than 2 bytes?
  102.     JNC    INIT1        ; If so don't use it
  103.     CALL    FILL        ; No, patch with tcaps eol string
  104.     JMP    INIT2
  105. INIT1:    XRA    A        ; Tell wm to simulate eol
  106.     STAX    D
  107. INIT2:    MVI    A,0FFH        ; Set no video i/o
  108.     STA    NOVIO
  109.     JMP    START        ; We're done
  110. ;
  111. FILL:    MOV    A,M        ; Replace wm data with ours
  112.     ORA    A
  113.     RZ
  114.     STAX    D
  115.     INX    H
  116.     INX    D
  117.     JMP    FILL
  118. ;
  119. COUT:    PUSH    H
  120.     PUSH    D
  121.     CALL    OUTCHR
  122.     POP    D
  123.     POP    H
  124.     RET
  125. ;
  126. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  127. ;
  128. ;    The following routines are from VLIB by Richard Conn.
  129. ;
  130. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  131. ;
  132. ; Clear Screen
  133. ;    Return with A=0 and Zero Flag Set if not done
  134. ;
  135. CLS:    PUSH    H        ; Save regs
  136.     PUSH    D
  137.     LHLD    VIDPTR        ; Pt to environment
  138.     MOV    A,M        ; No terminal?
  139.     CPI    ' '+1
  140.     JC    CLSERR
  141.     LXI    D,14H        ; Pt to cls delay
  142.     DAD    D
  143.     MOV    D,M        ; Get it
  144.     INX    H        ; Pt to cls string
  145.     INX    H
  146.     INX    H
  147.     MOV    A,M        ; Get first char of string
  148.     ORA    A        ; If no string, error
  149.     JZ    CLSERR
  150.     CALL    VIDOUT        ; Output string with delay
  151.     POP    D        ; Done
  152.     POP    H
  153.     XRA    A        ; Return NZ
  154.     DCR    A
  155.     RET
  156. ;
  157. CLSERR:    POP    D        ; Done
  158.     POP    H
  159.     XRA    A        ; Return Z
  160.     RET
  161. ;
  162. ;  VIDOUT - Output video string pted to by HL
  163. ;    Output also a delay contained in the D register
  164. ;
  165. VIDOUT:    MOV    A,M        ; Get next char
  166.     ORA    A        ; Done if zero
  167.     JZ    VIDO2
  168.     INX    H        ; Pt to next
  169.     CPI    '\'        ; Literal value?
  170.     JNZ    VIDO1
  171.     MOV    A,M        ; Get literal char
  172.     INX    H        ; Pt to after it
  173. VIDO1:    CALL    COUT        ; Output char
  174.     JMP    VIDOUT
  175. VIDO2:    MOV    A,D        ; Output delay
  176.     JMP    VIDELAY        ; Output delay
  177. ;
  178. ; GOTO XY    (From VLIB)
  179. ;    HL = Row/Col, with Home=1/1
  180. ;    Return with A=0 and Zero Flag Set if not done
  181. ;
  182. XYPOS:    MOV    D,L        ; Swap row & column
  183.     MOV    E,H        ;  for VLIB
  184.     XCHG
  185. GOTOXY:    PUSH    B        ; Save regs
  186.     PUSH    D
  187.     PUSH    H
  188.     LHLD    VIDPTR        ; Pt to environment
  189.     MOV    A,M        ; No terminal?
  190.     CPI    ' '+1
  191.     JC    ERR
  192.     LXI    D,15H        ; Pt to CM delay
  193.     DAD    D
  194.     MOV    A,M        ; Get it
  195.     STA    CMDELAY        ; Save it
  196.     INX    H        ; Pt to CL string
  197.     INX    H
  198.     CALL    VIDSKP        ; Skip CL string
  199.     MOV    A,M        ; Get first char of CM string
  200.     ORA    A        ; If no string, error
  201.     JZ    ERR
  202.     XCHG            ; DE=address of CM string
  203.     POP    H        ; Get coordinates in HL
  204.     PUSH    H
  205.     CALL    GXY        ; Output xy string with delay
  206.     LDA    CMDELAY        ; Pause
  207.     CALL    VIDELAY
  208.     POP    H        ; Done
  209.     POP    D
  210.     POP    B
  211.     XRA    A        ; Return NZ
  212.     DCR    A
  213.     RET
  214. ERR:    POP    H        ; Done
  215.     POP    D
  216.     POP    B
  217.     XRA    A        ; Return Z
  218.     RET
  219. ;
  220. ; GOTOXY    (From VLIB)
  221. ;   On input, H=Row and L=Column to Position To (1,1 is Home)
  222. ;   On input, DE=address of CM string
  223. ;
  224. GXY:    XRA    A        ; Set row/column
  225.     STA    RCORDER        ; Row before column
  226.     STA    RCBASE        ; Add 0 to base
  227. ;
  228. ; Cycle thru string
  229. ;
  230. GXYLOOP:LDAX    D        ; Get next char
  231.     INX    D        ; Pt to next
  232.     ORA    A        ; Done?
  233.     RZ
  234.     CPI    '%'        ; Command?
  235.     JZ    GXYCMD
  236.     CPI    '\'        ; Escape?
  237.     JZ    GXYESC
  238.     CALL    COUT        ; Send char
  239.     JMP    GXYLOOP
  240.  
  241. ;
  242. ; Escape - output following byte literally
  243. ;
  244. GXYESC:    LDAX    D        ; Get next char
  245.     CALL    COUT        ; Output literally
  246.     INX    D        ; Pt to next
  247.     JMP    GXYLOOP
  248. ;
  249. ; Interpret next character as a command character
  250. ;
  251. GXYCMD:    LDAX    D        ; Get command char
  252.     INX    D        ; Pt to next
  253.     CPI    'd'        ; %d
  254.     JZ    GXYOUT1
  255.     CPI    '2'        ; %2
  256.     JZ    GXYOUT2
  257.     CPI    '3'        ; %3
  258.     JZ    GXYOUT3
  259.     CPI    '.'        ; %.
  260.     JZ    GXYOUT4
  261.     CPI    '+'        ; %+v
  262.     JZ    GXYOUT5
  263.     CPI    '>'        ; %>xy
  264.     JZ    GXYGT
  265.     CPI    'r'        ; %r
  266.     JZ    GXYREV
  267.     CPI    'i'        ; %i
  268.     JZ    GXYINC
  269.     CALL    COUT        ; Output char if nothing else
  270.     JMP    GXYLOOP
  271. ;
  272. ; Set row/col home to 1,1 rather than 0,0
  273. ;
  274. GXYINC:    MVI    A,1        ; Set rcbase to 1
  275.     STA    RCBASE
  276.     JMP    GXYLOOP
  277. ;
  278. ; Reverse order of output to column then row (default is row then column)
  279. ;
  280. GXYREV:    MVI    A,1        ; Set column and row order
  281.     STA    RCORDER
  282.     JMP    GXYLOOP
  283. ;
  284. ; Command: >xy
  285. ;   If value of row/col is greater than x, add y to it
  286. ;
  287. GXYGT:    CALL    GETVAL        ; Get value
  288.     MOV    C,A        ; Save value
  289.     LDAX    D        ; Get value to test
  290.     INX    D        ; Pt to next
  291.     CMP    C        ; If carry, value>x
  292.     JNC    GXYGT1
  293.     LDAX    D        ; Get value to add
  294.     ADD    C
  295.     CALL    PUTVAL        ; Put value back
  296. GXYGT1:    INX    D        ; Pt to next
  297.     JMP    GXYLOOP        ; Resume
  298. ;
  299. ; Command: +n
  300. ;   Add n to next value and output
  301. ;
  302. GXYOUT5:LDAX    D        ; Get value to add
  303.     INX    D        ; Pt to next
  304.     MOV    B,A        ; Save in B
  305.     CALL    GETVAL        ; Get value
  306.     ADD    B        ; Add in B
  307.     CALL    COUT        ; Output value
  308. RCMARK:    LDA    RCORDER        ; Mark output
  309.     ORI    80H
  310.     STA    RCORDER
  311.     JMP    GXYLOOP
  312. ;
  313. ; Command: .
  314. ;   Output next value
  315. ;
  316. GXYOUT4:CALL    GETVAL        ; Get value
  317.     CALL    COUT        ; Output value
  318.     JMP    RCMARK
  319. ;
  320. ; Command: 3
  321. ;   Output next value as 3 decimal digits
  322. ;
  323. GXYOUT3:CALL    GETVAL        ; Get value
  324.     MVI    B,100        ; Output 100's
  325.     MVI    C,1        ; Leading zeroes
  326.     CALL    DIGOUT
  327. GXYOT3:    MVI    B,10        ; Output 10's
  328.     MVI    C,1        ; Leading zeroes
  329. GXYOT2:    CALL    DIGOUT
  330.     ADI    '0'        ; Output 1's
  331.     CALL    COUT
  332.     JMP    RCMARK
  333. ;
  334. ; Command: 2
  335. ;   Output next value as 2 decimal digits
  336. ;
  337. GXYOUT2:CALL    GETVAL        ; Get value
  338.     JMP    GXYOT3
  339. ;
  340. ; Command: d
  341. ;   Output next value as n decimal digits with no leading zeroes
  342. ;
  343. GXYOUT1:CALL    GETVAL        ; Get value
  344.     MVI    B,100        ; Output 100's
  345.     MVI    C,0        ; No leading zeroes
  346.     CALL    DIGOUT
  347.     MVI    B,10        ; Output 10's
  348.     MVI    C,0        ; No leading zeroes
  349.     JMP    GXYOT2
  350. ;
  351. ; Return next value in A
  352. ;
  353. GETVAL:    LDA    RCORDER        ; Get order flag
  354.     ORA    A        ; Already output the first value?
  355.     JM    GETVAL2
  356.     ANI    1        ; Look at lsb
  357.     JZ    GETVALR        ; If 0, row first
  358. GETVALC:LDA    RCBASE        ; Get base offset
  359.     ADD    L        ; Get column
  360.     RET
  361. ;
  362. GETVALR:LDA    RCBASE        ; Get base offset
  363.     ADD    H        ; Get row
  364.     RET
  365. ;
  366. GETVAL2:ANI    1        ; Look at lsb
  367.     JZ    GETVALC
  368.     JMP    GETVALR
  369. ;
  370. ; Store A as next value
  371. ;
  372. PUTVAL:    MOV    C,A        ; Save value
  373.     LDA    RCORDER        ; Get order flag
  374.     ORA    A        ; Already output the first value?
  375.     JM    PUTVAL2
  376.     ANI    1        ; Look at lsb
  377.     JZ    PUTVALR        ; If 0, row first
  378. PUTVALC:MOV    L,C        ; Set column
  379.     RET
  380. ;
  381. PUTVALR:MOV    H,C        ; Set row
  382.     RET
  383. ;
  384. PUTVAL2:ANI    1        ; Look at lsb
  385.     JZ    PUTVALC
  386.     JMP    PUTVALR
  387. ;
  388. ; Output A as decimal digit char
  389. ;   B=Quantity to Subtract from A, C=0 if no leading zero
  390. ;
  391. DIGOUT:    PUSH    D        ; Save DE
  392.     MVI    D,'0'        ; Char
  393. DECOT1:    SUB    B        ; Subtract
  394.     JC    DECOT2
  395.     INR    D        ; Increment char
  396.     JMP    DECOT1
  397. ;
  398. DECOT2:    ADD    B        ; Add back in
  399.     PUSH    PSW        ; Save result
  400.     MOV    A,D        ; Get digit
  401.     CPI    '0'        ; Zero?
  402.     JNZ    DECOT3
  403.     MOV    A,C        ; Get zero flag
  404.     ORA    A        ; 0=no zero
  405.     JZ    DECOT4
  406. DECOT3:    MOV    A,D        ; Get digit
  407.     CALL    COUT        ; Print it
  408. DECOT4:    POP    PSW        ; Get A
  409.     POP    D        ; Restore DE
  410.     RET
  411. ;
  412. ; GXY Buffers
  413. ;
  414. RCORDER:DS    1        ; 0=row/col, else col/row
  415. RCBASE:    DS    1        ; 0=org is 0,0, else org is 1,1
  416. CMDELAY:DS    1        ; Number of milliseconds to delay for CM
  417. ;
  418. ;    VIDELAY pauses for the number of milliseconds indicated by the A
  419. ; register.  VIDELAY assumes a ZCPR3 environment and uses it to determine
  420. ; processor speed.
  421. ;
  422. VIDELAY:PUSH    PSW        ; Save regs
  423.     PUSH    B
  424.     PUSH    D
  425.     PUSH    H
  426.     MOV    C,A        ; Save count in C
  427.     ORA    A        ; No delay?
  428.     JZ    DONE
  429.     LHLD    ENVPTR        ; Pt to environment
  430.     LXI    D,2BH        ; Offset to processor speed
  431.     DAD    D
  432.     MOV    A,M        ; Get processor speed
  433.     ORA    A        ; Zero?
  434.     JNZ    VID1
  435.     MVI    A,4        ; Assume 4 MHz
  436. VID1:    MOV    B,A        ; Processor speed in B
  437. VID2:    PUSH    B        ; Delay 1 ms
  438.     CALL    DELAY
  439.     POP    B
  440.     DCR    C        ; Count down
  441.     JNZ    VID2
  442. DONE:    POP    H        ; Restore regs
  443.     POP    D
  444.     POP    B
  445.     POP    PSW
  446.     RET
  447. ;
  448. ;  Delay 1 ms at Clock speed
  449. ;
  450. DELAY:    CALL    DEL1        ; Delay 1 ms at 1MHz
  451.     DCR    B        ; Count down clock speed
  452.     JNZ    DELAY
  453.     RET
  454. ;
  455. ;  Delay 1 ms at 1MHz
  456. ;
  457. DEL1:    MVI    C,20        ; 20 loops of 51 cycles each ~ 1000 cycles
  458. DEL1A:    XTHL            ; 18 cycles
  459.     XTHL            ; +18 = 36 cycles
  460.     DCR    C        ; + 5 = 41 cycles
  461.     JNZ    DEL1A        ; +10 = 51 cycles
  462.     RET
  463. ;
  464. ;  VIDSKP - Skip over video string pted to by HL; pt to byte after string
  465. ;
  466. VIDSKP:    MOV    A,M        ; Get next char
  467.     INX    H        ; Pt to next
  468.     ORA    A        ; Done if zero
  469.     RZ
  470.     CPI    '\'        ; Literal value?
  471.     JNZ    VIDSKP        ; Continue if not
  472.     INX    H        ; Pt to after literal value
  473.     JMP    VIDSKP
  474. ;
  475. ;  ZCPR3 Pointer save area
  476. ;
  477. VIDPTR:    DS    2        ; First byte of termcap entry
  478. ENVPTR:    DS    2
  479. ;
  480. BEGMEM    EQU    $
  481. ;
  482.     END
  483.