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 / C128 / BIOSR4.ARK / CX80.ASM < prev    next >
Assembly Source File  |  1987-04-26  |  5KB  |  251 lines

  1.  
  2.  
  3.     title    'CX40 & CX80   80 column drivers    26 Apr 87'
  4.  
  5.     maclib    cxequ
  6.  
  7.     maclib    z80
  8.  
  9.  
  10. lines    equ    24
  11.  
  12. ;    public    ?fundir            ; function direct
  13.  
  14.     public    ?int80
  15.     public    ?stat,?save,?recov
  16.  
  17.     extrn    ADM31
  18.  
  19.     page
  20. ;
  21. ;  This module has been modified by James Waltrip, you the user assume ;
  22. ;  _All_ liability for its use.  Original copyright is still maintained
  23. ;  Commodore.
  24. ;
  25. ;
  26. ;   The modifications to this module were to remove the 40 column driver
  27. ;   code.
  28. ;
  29. ;
  30. ;
  31. ;
  32. ;
  33. ;**
  34. ;**    This is the entry point to get to the function module
  35. ;** 
  36. ;
  37. ;
  38. ;    This code will perform the functions that the emulation
  39. ;    code will need to do to complete function.
  40. ;
  41. ;
  42. ;
  43. ;
  44. ;    enable  cursor,  then set foreground and background colors  
  45. ;
  46.     DSEG
  47. ?int80:
  48.     lxi    h,ADM31
  49.     shld    emulation$adr
  50.     lhld    key$tbl            ; logical color assignments at end of
  51.     lxi    d,11*4*8        ; ..key$table, (key$tbl size=11*4*8)
  52.     dad    d
  53.     shld    color$tbl$ptr        ; setup color table ptr
  54.  
  55.     mvi    a,80h
  56.     sta    current$atr
  57.  
  58. ;
  59. ;    program the 8563 for full flashing cursor
  60. ;
  61.     mvi    a,10            ; point to cursor start line#
  62.     call    R$wait            ;  and mode register
  63.     mvi    a,40h            ; start at line zero, cursor 1/16
  64.     outp    a
  65.     mvi    a,11            ; point to cursor end line#
  66.     call    R$wait
  67.     mvi    a,7
  68.     outp    a
  69.     ret
  70.  
  71.     page
  72. ;
  73. ;
  74.  
  75. ;**
  76. ;**    The following code is used to maintain the status line on
  77. ;**    both the 80 and 40 column displays
  78. ;**
  79. ;
  80. ;    save characters on the status line (80 column only) to buffer
  81. ;    reverse video the data area cleared (40 and 80 column screens)
  82. ;
  83. ;    C=start column #    B=number of characters to save
  84. ;
  85.     DSEG
  86. ?save:
  87.  
  88. do$save$80:
  89.     mov    a,b
  90.     lxi    h,lines*80        ; point to status line
  91.     lxi    d,buffer$80$col        ; point to save buffer
  92.     mvi    b,0            ; zero MSB
  93.     dad    b            ; point to char position to save
  94.  
  95. save$loop:
  96.     push    psw            ; save count
  97.     push    d            ; save buffer address
  98.     call    R$read$memory        ; read char(B) and attribute(A)
  99.     pop    d            ; recover buffer pointer
  100.     stax    d            ; save character
  101.     inx    d            ; advance buffer
  102.     mov    a,b            ; get atrb to A
  103.     stax    d            ; save atrb
  104.     inx    d            ; advance buffer
  105.     push    d
  106.  
  107.     mvi    a,01000000b        ; reverse video only
  108.     call    get$atr$color        ; returned in A
  109.     mvi    d,' '            ; get character
  110.     call    R$write$memory
  111.  
  112.     pop    d
  113.     pop    psw            ; recover count
  114.     inx    h
  115.     dcr    a            ; adjust count
  116.     jrnz    save$loop        ; loop if not done
  117.     ret
  118.  
  119.     page
  120. ;
  121. ;    recover characters to the status line (80 column only)
  122. ;    for the 40 column screen just clear status line (with spaces)
  123. ;
  124. ;    C=start column #    B=number of characters to restore
  125. ;
  126.     DSEG
  127. ?recov:
  128. recove$80:
  129.     mov    a,b
  130.     lxi    h,lines*80        ; point to status line
  131.     lxi    d,buffer$80$col        ; point to save buffer
  132.     mvi    b,0            ; zero MSB
  133.     dad    b            ; point to char position to save
  134.  
  135. recov$80$loop:
  136.     push    psw            ; save count
  137.     ldax    d            ; get attribute
  138.     inx    d            ; advance pointer
  139.     mov    b,a            ; save attribute in B
  140.     ldax    d            ; get character in A
  141.     inx    d            ; advance pointer
  142.     push    d            ; save buffer address
  143.     mov    d,a            ; move character to D
  144.     mov    a,b            ; move attribute to A
  145.     call    R$write$memory        ; write char(D) and attribute(A)
  146.     pop    d            ; recover buffer pointer
  147.     pop    psw            ; recover count
  148.     inx    h
  149.     dcr    a            ; adjust count
  150.     jrnz    recov$80$loop        ; loop if not done
  151.     ret
  152.  
  153.     page
  154. ;
  155. ;    Places data on the system status line
  156. ;
  157. ;    for the 80 column screen a number of character attributes
  158. ;    are available: flash, underline, reverse video
  159. ;
  160. ;    for the 40 column screen only reverse video is available
  161. ;
  162. ;    INPUT:
  163. ;        A=attribute  (7654 3210)
  164. ;            6-reverse video
  165. ;            5-underline
  166. ;            4-blink
  167. ;        B=character to write (ASCII)
  168. ;        C=column number to write
  169. ;            (>40 does nothing to 40 column screen)
  170. ;
  171.     DSEG
  172. ?stat:
  173.     push    psw
  174.     push    b            ; save for 80 column display
  175.     mov    e,a            ; save attribute in E
  176. ;
  177. ;    display on 80 column display now
  178. ;
  179. not$40$col$wr:
  180.     pop    d            ; D=character  E=position
  181.     pop    psw            ; get new attribute
  182.     call    get$atr$color
  183.  
  184.     mov    b,d            ; save character to write in B
  185.     lxi    h,lines*80
  186.     mvi    d,0
  187.     dad    d            ; point to character location
  188.     mov    d,b            ; place character to write in D
  189.     jmp    R$write$memory
  190.  
  191.  
  192. ;
  193. ;    using attribute in A add color to it and return in A
  194. ;
  195. ;    destroys BC
  196. ;
  197.     DSEG
  198. get$atr$color:
  199.     push    h
  200.     push    psw
  201.     lda    bg$color$80
  202.     mov    c,a
  203.     mvi    b,0
  204.     lxi    h,status$color$tbl
  205.     dad    b            ; point to status color 
  206.     pop    psw
  207.     ani    01110000b        ; limit good attr
  208.     mov    b,a            ; save in E
  209.     mov    a,m            ; get status color
  210.     ani    0fh            ; only want 80 column status color
  211.     ora    b            ; merge with new attr
  212.     ori    80h            ; select alternate character set
  213.     pop    h
  214.     ret
  215.  
  216. ;
  217. ;
  218. ;
  219. ;
  220. ;
  221. ;
  222.     CSEG
  223. ;
  224. ;
  225. ;
  226. ;
  227. ;    MSB is 40 column status color, LSB is 80 column status color
  228. ;
  229. status$color$tbl:
  230.     db    05eh            ; status color #1
  231.     db    0f6h            ; status color #2
  232.     db    0a6h            ; status color #3
  233.     db    0b7h            ; status color #4
  234.     db    0d7h            ; status color #5
  235.      db    0d4h            ; status color #6
  236.     db    0e7h            ; status color #7
  237.     db    083h            ; status color #8
  238.     db    097h            ; status color #9
  239.     db    0a8h            ; status color #10
  240.     db    09eh            ; status color #11
  241.     db    0ffh            ; status color #12
  242.     db    0bdh            ; status color #13
  243.     db    058h            ; status color #14
  244.     db    06fh            ; status color #15
  245.     db    0ceh            ; status color #16
  246.  
  247.  
  248. db    0bdh            ; status color #13
  249.     db    058h            ; status color #14
  250.     db    06fh            ; status color #15
  251.     db    0ceh