home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug094.arc / FIX-256.ARC / ROUTINES.PAK < prev    next >
Text File  |  1988-06-14  |  15KB  |  813 lines

  1. ; Collection of routines from the Programming Notes
  2. ;  compiled by Vaughan Clarkson, '88
  3.  
  4. ;----------------<ROUTINE to CHECK BIOS NUMBER>-----------------
  5.  
  6. biosvct    equ    0001h
  7.  
  8. Check_BIOS:
  9. ; Check_BIOS checks the BIOS version number to find out whether
  10. ; the BIOS supports XBIOS subset 'C'.  It uses this logic:
  11. ; IF Bios_Type IS
  12. ;   > 1 and < 17h and <> 6 or
  13. ;   > 1Dh and < 2Fh or
  14. ;   > 43h and < BFh
  15. ; THEN XBIOS subset 'C' is supported
  16. ; ELSE subset 'C' is not supported (see notes below for this case)
  17. ; If XBIOS is supported then the Z flag will be set
  18.  
  19.     push    de
  20.     push    hl
  21.     lΣ    hl,(biosvct⌐    ╗ warφ star⌠ entr∙ (BIO╙ ½ 3)
  22.     ld    de,30h
  23.     add    hl,de        ╗ (BIO╙ ½ 33h⌐ ╜ BIOS_TYPE
  24.     ld    e,a
  25.     ld    a,(hl)
  26.     ld    d,0        ; set flag to true
  27.     cp    2        ; check version numbers
  28.     jr    c,xbfail
  29.     cp    6
  30.     jr    z,xbfail
  31.     cp    17h
  32.     jr    c,use_xb
  33.     cp    1Eh
  34.     jr    c,xbfail
  35.     cp    2Fh
  36.     jr    c,use_xb
  37.     cp    44h
  38.     jr    c,xbfail
  39.     cp    0BFh
  40.     jr    c,use_xb
  41. xbfail║    lΣ    d,-▒        ╗ flag=falsσ (incorrec⌠ XBIOS)
  42. use_xb:    ld    a,d
  43.     or    a        ; test flag
  44.     ld    a,e
  45.     pop    hl
  46.     pop    de
  47.     ret
  48.  
  49.  
  50. ;------------------<CLEAR QUEUE after KB_TEST>-------------------
  51.  
  52. bdos    equ    0005h        ; BDOS jump vector
  53. dconio    equ    6        ; BDOS direct console in/out
  54.  
  55. clr_queue:
  56. ; Clears console queue for normal keyboard use after kb_test
  57.     ld    e,-1           ; signal console inè    ld    c,dconio
  58.     call    bdos
  59.     or    a
  60.     jr    nz,clr_queue
  61.     ret
  62.  
  63.  
  64. ;-----------------------<CHECK if 256TC>------------------------
  65.  
  66. rom_end    equ    0EFFFh
  67.  
  68. is_256TC:
  69. ; Routine to test which keyboard is being used.
  70. ; Z indicates new keyboard, NZ indicates the old.
  71. ; Corrupts AF.
  72.     push    hl
  73.     ld    hl,rom_end-2
  74.     ld    a,'2'
  75.     cp    (hl)
  76.     jr    nz,not256
  77.     inc    hl
  78.     ld    a,'5'
  79.     cp    (hl)
  80.     jr    nz,not256
  81.     inc    hl
  82.     ld    a,'6'
  83.     cp    (hl)
  84. not256:    pop    hl
  85.     ret
  86.  
  87.  
  88. ;------------------------<Get KEY DATA>--------------------------
  89.  
  90. key_data:
  91. ╗ Thi≤ routinσ return≤ ßn ┌ flaτ iµ n∩ changσ iε keyboarΣ statu≤
  92. ; or an NZ flag and appropriate data in the accumlator otherwise.
  93. ; Note: this routine is only suitable for 256TC keyboards.
  94.     in    a,(2)        ; check for change in status
  95.     bit    1,a
  96.     ret    z
  97.     in    a,(18h)        ; get data
  98.     ret
  99.  
  100.  
  101. ;----------------------<CLEAR KEY BUFFER>------------------------
  102.  
  103. clr_kbuf:
  104. ; Clear the keyboard buffer of all data.
  105. ; Corrupts AF.
  106.     in    a,(2)
  107.     and    2
  108.     ret    z
  109.     in    a,(18h)
  110.     jr    clr_kbuf
  111.  
  112.  
  113. ;--------------------------<IS_CLOSED>---------------------------
  114.  
  115. isclsd:
  116. ; This routine checks if the key whose code is given in the
  117. ; accumulator is being pressed.  An NZ flag is returned if it
  118. ; is down and a Z flag if it is not.  The codes used in this
  119. ; routine are identical to those given for the XBIOS function
  120. ; kb_test (details above).
  121. ; Note:- this routine works only on the old keyboard.
  122.     push    bc
  123.     ld    c,a
  124.     ld    b,a
  125. close1:    ld    a,12h
  126.     out    (0Ch),a
  127.     ld    a,b
  128.     rrca
  129.     rrca
  130.     rrca
  131.     rrca
  132.     and    3
  133.     out    (0Dh),a
  134.     ld    a,13h
  135.     out    (0Ch),a
  136.     ld    a,b
  137.     rlcaè    rlca
  138.     rlca
  139.     rlca
  140.     out    (0Dh),a
  141.     ld    a,1
  142.     out    (0Bh),a
  143.     ld    a,10h
  144.     out    (0Ch),a
  145.     in    a,(0Dh)
  146. la52f:    ld    a,1Fh
  147.     out    (0Ch),a
  148.     out    (0Dh),a
  149. la535:    in    a,(0Ch)
  150.     bit    7,a
  151.     jr    z,la535
  152.     in    a,(0Ch)
  153.     cpl
  154.     bit    6,a
  155.     ld    a,0
  156.     out    (0Bh),a
  157.     ld    a,c
  158.     pop    bc
  159.     ret
  160.  
  161.  
  162. ;---------------------<IS_CLOSED for 256TC>----------------------
  163.  
  164. isclsd:
  165. ; Routine to emulate isclsd on old keyboards.
  166. ; Note that this routine works only for 256TC keyboards.
  167. ; Also provided is case, which contains the status of the
  168. ; SHIFT, ALT and CTRL keys in bits 2, 1 and 0 respectively
  169. ; at the time of the last call to isclsd.
  170.     push    bc
  171.     push    de
  172.     push    hl
  173.     ld    b,a
  174.     call    key_3        ; * (these lines removed in in-
  175.     ld    a,b        ; * terrupt version, see below)
  176.     cp    3Fh        ; SHIFT?
  177.     jr    z,tishift
  178.     cp    39h        ; CTRL?
  179.     jr    z,tisctrl
  180.     cp    40h        ; ALT?
  181.     jr    z,tisalt
  182.     cp    64h
  183.     jr    nc,tistbigè    cp    20h
  184.     jr    c,tnorm
  185.     cp    30h
  186.     jr    nc,tnorm
  187.     sub    20h
  188.     add    a,a        ; check exceptions table
  189.     ld    hl,itt_ex
  190.     ld    e,a
  191.     ld    d,0
  192.     add    hl,de
  193.     ld    a,(hl)
  194.     inc    a
  195.     jr    z,isret
  196.     call    ischck
  197.     jr    nz,isret
  198.     inc    hl
  199.     jr    chk2nd
  200.  
  201. tnorm║    lΣ    hl,ittab∞    ╗ conver⌠ t∩ natura∞ 256T├ codes
  202.     ld    e,a
  203.     ld    d,0
  204.     add    hl,de
  205. chk2nd:    ld    a,(hl)
  206.     inc    a
  207.     jr    z,isret
  208.     call    ischck
  209.     jr    isret
  210.  
  211. tistbig:xor    a
  212.     jr    isret
  213.  
  214. tishift:ld    a,(case)
  215.     and    4
  216.     jr    isret
  217.  
  218. tisalt:    ld    a,(case)
  219.     and    2
  220.     jr    isret
  221.  
  222. tisctrl:ld    a,(case)
  223.     and    1
  224. isret:    ld    a,b
  225.     pop    hl
  226.     pop    de
  227.     push    af
  228.     pop    bc
  229.     ld    a,c
  230.     and    0feh            ; scf, ccf
  231.     xor    40h            ; toggle z flag
  232.     ld    c,a
  233.     push    bc
  234.     pop    af
  235.     pop    bc
  236.     ret
  237. èischck:    push    hl
  238.     dec    a
  239.     ld    hl,isctbl
  240.     ld    e,a
  241.     ld    d,0
  242.     add    hl,de
  243.     ld    a,(hl)
  244.     and    80h
  245.     pop    hl
  246.     ret
  247.  
  248. key_3:    xor    a
  249.     out    (0Bh),a
  250.     in    a,(2)        ;check port 2, bit 1 for key
  251.     and    2
  252.     ret    z
  253.     in    a,(18h)        ;read port 18h for key code
  254.     ld    d,a
  255.     ld    hl,case        ;check for SHIFT, CTRL, and ALT
  256.     res    7,a
  257.     cp    67h        ;check SHIFT
  258.     jr    nz,ctrl
  259.     bit    7,d        ;is SHIFT up or down?
  260.     res    2,(hl)
  261.     ret    z
  262.     set    2,(hl)
  263.     ret
  264.  
  265. ctrl:    cp    6Fh        ;check CTRL
  266.     jr    nz,alt
  267.     bit    7,d        ;is CTRL up or down?
  268.     res    0,(hl)
  269.     ret    z
  270.     set    0,(hl)
  271.     ret
  272.  
  273. alt:    cp    77h        ;check ALT
  274.     ld    a,d        ;signal no special key
  275.     jr    nz,setist    ; and return with key code, if not ALT
  276.     bit    7,d        ;is ALT up or down?
  277.     set    1,(hl)
  278.     ret    nz
  279.     res    1,(hl)
  280.     ret
  281.  
  282. setist:    ld    hl,isctbl    ;signal key up/down on isctbl
  283.     and    7Fh
  284.     push    bc
  285.     ld    c,a
  286.     ld    b,0
  287.     add    hl,bc
  288.     pop    bc
  289.     ld    a,d
  290.     and    80h
  291.     res    7,(hl)è    ret    z
  292.     set    7,(hl)
  293.     ret
  294.  
  295. case║    dΓ    ░        ╗ inf∩ oε CTRL¼ AL╘ anΣ SHIFT
  296. isctbl:    ds    60h,0        ; table of keys down
  297.  
  298. ; table of code conversions from isclsd codes to natural codes
  299. ; for the 256TC keyboard (-1 means code not used)
  300. ittabl║    dΓ    5Bh,0Bh,37h,27h,1Bh,1Ah,23h,2Bh
  301.     db    33h,42h,3Bh,43h,4Bh,47h,3Fh,4Ah
  302.     db    52h,0Ah,22h,13h,2Ah,3Ah,2Fh,12h
  303.     db    1Fh,32h,17h,5Ah,56h,5Eh,55h,54h
  304.     db    -1,-1,-1,-1,-1,-1,-1,-1
  305.     db    -1,-1,-1,-1,-1,-1,-1,-1
  306.     db    1,4Dh,2,0Eh,4Eh,0Dh,3,7
  307.     db    46h,-1,35h,3Dh,-1,-1,36h,-1
  308.     db    -1,0,8,10h,18h,20h,28h,30h
  309.     db    38h,40h,48h,50h,58h,1,46h,0Fh
  310.     db    54h,3Dh,35h,36h,3,2Ch,25h,26h
  311.     db    34h,2Eh,1Dh,1Eh,24h,2Dh,15h,16h
  312.     db    1Ch,5,6,14h
  313.  
  314. ; exception table for ittable, for those isclsd codes which
  315. ; correspond to two keys on the new keyboard (eg. the code 20h
  316. ; corresponds to the 1 key, of which there are two, and whose
  317. ; codes are 51h and 5)
  318. itt_ex:    db    51h,5,9,2Dh,11h,15h,19h,16h,21h,2Eh
  319.     db    29h,1Dh,31h,1Eh,39h,2Ch,41h,25h,49h,26h
  320.     db    59h,24h,53h,14h,4Fh,-1,5Dh,1Ch,57h,6
  321.     db    5Fh,34h
  322.  
  323.  
  324. ;--------------------<SET INTERRUPT VECTORS>---------------------
  325.  
  326. ; The interrupt vectors below have been chosen arbitrarily.  Any
  327. ; convenient memory location will do.  Note, however, that both
  328. ; interrupt vectors must be contained in the same page of memory,
  329. ; ie. the same 100h block.
  330. vect_a    equ    4000h        ; interrupt vector for PIO port A
  331. vect_b    equ    vect_a+2    ; interrupt vector for PIO port B
  332.  
  333. set_int:
  334. ; This routine sets up the PIO so that the keyboard drives anè; interrupt.
  335. ; Note: this routine works only with the 256TC keyboard.
  336.     push    af
  337.     push    bc
  338.     push    de
  339.     push    hl
  340.     ld    hl,eireti    ; see new version of key_3, below
  341.     ld    (vect_a),hl
  342.     ld    hl,key_3
  343.     ld    (vect_b),hl
  344.     di            ╗ disablσ interrupt≤
  345.     ld    hl,iotabl
  346. do_pio:    ld    a,(hl)
  347.     or    a
  348.     jr    z,enabli
  349.     ld    b,a
  350.     inc    hl
  351.     ld    c,(hl)
  352.     inc    hl
  353.     otir
  354.     jr    do_pio
  355.  
  356. enabli:    im    2        ; set interrupt mode 2
  357.     ld    a,HIGH vect_a    ╗ or 40h iµ HIG╚ i≤ supporteΣ
  358.     ld    i,a
  359.     ei            ; reenable interrupts
  360.     pop    hl
  361.     pop    de
  362.     pop    bc
  363.     pop    af
  364.     ret
  365.  
  366. ; If LOW is not supported on your assembler, substitute
  367. ; 0 for LOW vect_a and 2 for LOW vect_b
  368. ; Note: HIGH and LOW mean high order and low order 8 bits,
  369. ; respectively.
  370. iotabl:    db    5,1,LOW vect_a,0CFh,-1,97h,-1
  371.     db    5,3,LOW vect_b,-1,9Bh,0B7h,0EDh
  372.     db    0
  373.  
  374.  
  375. ;------------------<KEY_3: INTERRUPT VERSION>--------------------
  376.  
  377. key_3:    push    af
  378.     push    bc
  379.     push    de
  380.     push    hl
  381.     in    a,(2)        ;check port 2, bit 1 for keyè    and    2
  382.     jr    z,retk3
  383.     in    a,(18h)        ;read port 18h for key code
  384.     ld    d,a
  385.     ld    hl,case        ;check for SHIFT, CTRL, and ALT
  386.     res    7,a
  387.     cp    67h        ;check SHIFT
  388.     jr    nz,ctrl
  389.     bit    7,d        ;is SHIFT up or down?
  390.     res    2,(hl)
  391.     jr    z,retk3
  392.     set    2,(hl)
  393.     jr    retk3
  394.  
  395. ctrl:    cp    6Fh        ;check CTRL
  396.     jr    nz,alt
  397.     bit    7,d        ;is CTRL up or down?
  398.     res    0,(hl)
  399.     jr    z,retk3
  400.     set    0,(hl)
  401.     jr    retk3
  402.  
  403. alt:    cp    77h        ;check ALT
  404.     ld    a,d        ;signal no special key
  405.     jr    nz,setist    ; and return with key code, if not ALT
  406.     bit    7,d        ;is ALT up or down?
  407.     set    1,(hl)
  408.     jr    nz,retk3
  409.     res    1,(hl)
  410.     jr    retk3
  411.  
  412. setist:    ld    hl,isctbl    ;signal key up/down on isctbl
  413.     and    7Fh
  414.     push    bc
  415.     ld    c,a
  416.     ld    b,0
  417.     add    hl,bc
  418.     pop    bc
  419.     ld    a,d
  420.     and    80h
  421.     res    7,(hl)
  422.     jr    z,retk3
  423.     set    7,(hl)
  424. retk3:    pop    hl
  425.     pop    de
  426.     pop    bc
  427.     pop    af
  428. eireti:    ei
  429.     reti
  430.  
  431.  
  432. ;-----------------------<EXAMINE SYSTEM>-------------------------
  433.  
  434. screen    equ    0F000h        ; char and att memory
  435. grafix    equ    0F800h        ; PCG and colour memory
  436. vmlatch    equ    1Ch        ; video memory latch port
  437. attrib    equ    144        ; attribute switch
  438. c_port    equ    8        ; colour port
  439. c_swtch    equ    40h        ; colour port switch
  440. row    equ    64        ; no of characters per row
  441.  
  442. examine:
  443. ; This routine examines the system to determine whether it
  444. ; (i) has colour (if not, colour is set to -1)
  445. ; (ii) is a Premium (if not, prmium is set to -1) and
  446. ; {iii} is a 256TC (if not, tc256 is set to -1)
  447. ╗ Note║ iµ thσ systeφ i≤ ß Premium¼ theε i⌠ i≤ als∩ colour¼ and
  448. ; if it is a 256TC, then it is also a Premium and colour, for
  449. ; the purposes of this routine.
  450. ; Corrupts AF and HL.
  451.     call    is_256TC    ; see above for this routine
  452.     ret    z
  453.     ld    a,-1
  454.     ld    (tc256),a
  455.     ld    hl,screen+32*row-1
  456.     ld    (hl),0è    ld    a,attrib
  457.     out    (vmlatch),a
  458.     ld    (hl),-1
  459.     ld    a,80h
  460.     out    (vmlatch),a
  461.     ld    a,(hl)
  462.     ld    (prmium),a
  463.     or    a
  464.     ret    z
  465.     ld    hl,grafix+32*row-1
  466.     ld    (hl),0
  467.     ld    a,c_swtch
  468.     out    (c_port),a
  469.     ld    (hl),7
  470.     xor    a
  471.     out    (c_port),a
  472.     ld    a,(hl)
  473.     or    a
  474.     ret    z
  475.     ld    a,-1
  476.     ld    (colour),a
  477.     ret
  478.  
  479. colour:    db    0        ; 0 = colour
  480. prmium:    db    0        ; 0 = Premium series or later
  481. tc256:    db    0        ; 0 = 256TC
  482.  
  483.  
  484. ;--------------------<SET SCREEN to HIRES2>----------------------
  485.  
  486. initcol    equ    2        ; green on black
  487.  
  488. set_scn:
  489. ; Set up the screen in a rough equivalent to the HIRES2 command
  490. ; of MicroWorld BASIC.  Clears the screen, sets 64x16 video mode
  491. ╗ set≤ thσ screeε colou≥ t∩ initco∞ anΣ fill≤ thσ screeε froφ
  492. ; left to right, top to bottom with PCG, starting in the top left
  493. ; with character 80h, bank 0, and ending in the bottom right with
  494. ; character FFh, bank 7.
  495. ; Corrupts all registers.
  496. ; Returns c flag if error (ie. not Premium)
  497.     ld    a,(prmium)    ; see examine routine above
  498.     or    a
  499.     scf
  500.     ret    z
  501.     ld    hl,screen    ; clear the screen
  502.     ld    (hl),' '
  503.     ld    de,screen+1
  504.     ld    bc,32*row-1
  505.     ldir
  506.     call    reform        ; set 64x16 mode
  507.     ld    bc,0
  508. rfwait:    dec    bcè    ld    a,b
  509.     or    c
  510.     jp    nz,rfwait
  511.     ld    b,8
  512.     ld    a,80h
  513. clgrfx:    push    bc
  514.     out    (vmlatch),a
  515.     ld    hl,grafix
  516.     ld    (hl),0
  517.     ld    de,grafix+1
  518.     ld    bc,128*char
  519.     ldir
  520.     inc    a
  521.     pop    bc
  522.     djnz    clgrfx
  523.     ld    a,c_swtch        ; set up initial screen colour
  524.     out    (c_port),a
  525.     ld    hl,grafix
  526.     ld    (hl),initcol
  527.     ld    de,grafix+1
  528.     ld    bc,16*row-1
  529.     ldir
  530.     xor    a
  531.     out    (c_port),a
  532.     ld    b,8            ; set up screen & attributes
  533.     ld    hl,screen
  534.     ld    de,screen+1
  535.     ld    a,attrib
  536.     out    (vmlatch),a
  537.     xor    a
  538. setatt:    push    bc
  539.     ld    bc,2*row
  540.     ld    (hl),a
  541.     ldir
  542.     inc    a
  543.     pop    bc
  544.     djnz    setatt
  545.     ld    a,80h
  546.     out    (vmlatch),a
  547.     ld    hl,screen
  548.     ld    c,8
  549. setscn:    ld    b,2*row
  550.     ld    a,80h
  551. setrow:    ld    (hl),a
  552.     inc    a
  553.     inc    hl
  554.     djnz    setrow
  555.     dec    c
  556.     jr    nz,setscn
  557.     re⌠                ╗ π flaτ i≤ rese⌠
  558.  
  559. reform:    ld    hl,v_64+15        ; routine to set up 64*16
  560. refrm2:    push    bc
  561.     push    hl
  562.     ld    b,10hèformat:    ld    a,b
  563.     dec    a
  564.     out    (0ch),a
  565.     ld    a,(hl)
  566.     out    (0dh),a
  567.     dec    hl
  568.     djnz    format
  569.     ld    b,4Bh
  570.     call    leee3
  571.     pop    hl
  572.     pop    bc
  573.     ret
  574.  
  575. leee3:    push    hl            ; routine for 64*16
  576. leee4:    ld    hl,007Ah
  577. leee7:    dec    hl
  578.     ld    a,h
  579.     or    l
  580.     jr    nz,leee7
  581.     djnz    leee4
  582.     pop    hl
  583.     ret
  584.  
  585. v_64:    db    6Bh,64,51h,37h,12h,9,16,12h,48h,0Fh,2Fh,0Fh,0,0,0,0
  586.  
  587.  
  588. ;------------------------<LINE DRAWING>--------------------------
  589.  
  590. line:
  591. ; This routine is used in conjunction with hires2 above and
  592. ; draws a straight line from (from_x, from_y) to (to_x, to_y).
  593. ; Corrupts all registers, including IY and alternative regs.
  594.     call    calcxy
  595.     ex    af,af'
  596.     ld    a,(set)
  597.     ex    af,af'
  598.     ld    hl,(from_x)
  599.     ld    de,(to_x)
  600.     call    subabs
  601.     ld    b,h
  602.     ld    c,l
  603.     ld    hl,pix_lt
  604.     jp    nc,cupok
  605.     ld    hl,pix_rt
  606. cupok:    ld    (vect_1),hl
  607.     ld    hl,(from_y)
  608.     ld    de,(to_y)
  609.     call    subabs
  610.     ld    d,h
  611.     ld    e,l
  612.     ld    hl,pix_up
  613.     jp    nc,crtok
  614.     ld    hl,pix_dnècrtok:    ld    (vect_2),hl
  615.     ld    h,b
  616.     ld    l,c
  617.     or    a
  618.     sbc    hl,de
  619.     jp    nc,swaphd
  620.     ld    hl,(vect_1)
  621.     ld    iy,(vect_2)
  622.     ld    (vect_2),hl
  623.     ld    (vect_1),iy
  624.     ld    h,b
  625.     ld    l,c
  626.     ex    de,hl
  627.     ld    b,h
  628.     ld    c,l
  629. swaphd:    push    bc
  630.     push    bc
  631.     ld    hl,0
  632.     srl    b
  633.     rr    c
  634.     or    a
  635.     sbc    hl,bc
  636.     push    hl
  637.     pop    iy
  638.     dec    iy
  639.     pop    bc
  640.     ld    hl,0
  641.     or    a
  642.     sbc    hl,bc
  643.     ld    b,h
  644.     ld    c,l
  645.     pop    hl
  646.     ld    a,h
  647.     or    l
  648.     jr    z,conend
  649. smline:    exx
  650.     call    c_plot
  651. smmove:    call    pix_rt
  652.     exx
  653.     add    iy,de
  654.     jp    nc,endmov
  655.     add    iy,bc
  656.     exx
  657. bgmove:    call    pix_dn
  658.     exx
  659. endmov:    dec    hl
  660.     ld    a,h
  661.     or    l
  662.     jp    nz,smline
  663. conend:    exx
  664.     call    c_plot
  665.     exx
  666.     ret
  667.  
  668. vect_1    equ    smmove+1èvect_2    equ    bgmove+1
  669.  
  670. calcxy:    exx
  671.     lΣ    hl,(from_x⌐    ╗ calculatσ initia∞ datß fo≥ linσ
  672.     ld    a,7
  673.     and    l
  674.     ld    b,a
  675.     ld    a,80h
  676.     jr    z,noshft
  677. shftpx:    srl    a
  678.     djnz    shftpx
  679. noshft:    ld    c,a
  680.     ld    a,0F8h
  681.     and    l
  682.     ld    l,a
  683.     add    hl,hl
  684.     ex    de,hl
  685.     ld    hl,(from_y)
  686.     ld    a,15
  687.     and    l
  688.     ld    b,a
  689.     ld    a,0E0h
  690.     and    l
  691.     rlca
  692.     rlca
  693.     rlca
  694.     ld    (bank),a
  695.     or    80h
  696.     out    (vmlatch),a
  697.     bit    4,l
  698.     ld    l,b
  699.     ld    h,0
  700.     jr    z,hlfblk
  701.     ld    h,4
  702. hlfblk:    add    hl,de
  703.     ld    de,grafix
  704.     add    hl,de
  705.     exx
  706.     ret
  707.  
  708. ╗ Thσ nex⌠ tw∩ routine≤ se⌠ anΣ rese⌠ thσ pixe∞ a⌠ thσ curren⌠
  709. ; location
  710.  
  711. c_plot:    ex    af,af'
  712.     or    a
  713.     jp    z,creset
  714.     ex    af,af'
  715.     ld    a,c
  716.     or    (hl)
  717.     ld    (hl),a
  718.     ret
  719.  
  720. creset:    ex    af,af'
  721.     ld    a,c
  722.     or    (hl)è    xor    c
  723.     ld    (hl),a
  724.     ret
  725.  
  726. ╗ Thσ followinτ routines¼ pix_lt¼ pix_rt¼ pix_up¼ pix_dn¼ movσ
  727. ╗ thσ curren⌠ pixe∞ locatioε left¼ right¼ u≡ anΣ dowε
  728. ; respectively
  729.  
  730. pix_lt:    sla    c
  731.     ret    nc
  732.     ld    c,1
  733.     ld    de,-char
  734.     add    hl,de
  735.     ret
  736.  
  737. pix_rt:    srl    c
  738.     ret    nc
  739.     ld    c,80h
  740.     ld    de,char
  741.     add    hl,de
  742.     ret
  743.  
  744. pix_up:    ld    a,b
  745.     or    a
  746.     jr    z,chr_up
  747.     dec    b
  748.     dec    hl
  749.     ret
  750.  
  751. chr_up:    ld    de,char-1
  752.     ld    b,e
  753.     add    hl,de
  754.     ld    a,4
  755.     xor    h
  756.     ld    h,a
  757.     bit    2,h
  758.     ret    z
  759.     ld    a,(bank)
  760.     dec    a
  761.     ld    (bank),a
  762.     or    80h
  763.     out    (vmlatch),a
  764.     ret
  765.  
  766. pix_dn:    ld    a,b
  767.     inc    a
  768.     cp    char
  769.     jr    nc,chr_dn
  770.     ld    b,a
  771.     inc    hl
  772.     ret
  773.  
  774. chr_dn:    xor    a
  775.     ld    b,a
  776.     ld    de,-char+1è    add    hl,de
  777.     ld    a,4
  778.     xor    h
  779.     ld    h,a
  780.     bit    2,h
  781.     ret    nz
  782.     ld    a,(bank)
  783.     inc    a
  784.     ld    (bank),a
  785.     or    80h
  786.     out    (vmlatch),a
  787.     ret
  788.  
  789. subabs:    ld    a,h        ;perform absolute of hl - de
  790.     cp    d
  791.     jp    c,abshls
  792.     jp    nz,absdes
  793.     ld    a,l
  794.     cp    e
  795.     jp    c,abshls
  796. absdes:    or    a
  797.     sbc    hl,de
  798.     ret
  799. abshls:    ex    de,hl
  800.     or    a
  801.     sbc    hl,de
  802.     scf
  803.     ret
  804.  
  805. from_x:    dw    0
  806. from_y:    dw    0
  807. to_x:    dw    0
  808. to_y:    dw    0
  809. bank:    db    0
  810. set:    db    0
  811.  
  812.  
  813.