?login_element?

Subversion Repositories NedoOS

Rev

Rev 1470 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;Spectrum I/O and utility code
  2.  
  3. ;I originally wrote these routines to match their namesakes in a
  4. ;CP/M library -
  5. ;therefore CON6 refers to the CP/M BDOS, function 6.
  6.  
  7. ;FRAMES  EQU #5C78 ;50Hz counter
  8.  
  9. ;Enter a filename
  10. NAMEBUF
  11.         DEFS 20
  12. FNBUF
  13.         DEFS 20
  14. FNAME_
  15.         DEFB 13,10,"Filename> $"
  16.  
  17. GNAME
  18.         LD      DE,FNAME_
  19.         LD      C,9
  20.         CALL    ZXFDOS
  21.         LD      A,pg3
  22. ;Z-address 4000h
  23.         CALL    selmem
  24.         LD      HL,#C000
  25.         LD      DE,NAMEBUF
  26.         LD      BC,20
  27.         LDIR
  28. ;Backup Z-machine memory at #4000
  29.         LD      HL,#C000
  30.         LD      (HL),16
  31. ;Max. 16 characters in name
  32.         INC     HL
  33.         LD      (HL),0
  34. ;None provided
  35.         LD      A,pg6
  36.         CALL    selmem
  37.         LD      DE,0
  38.         LD      HL,#4000
  39. ;Filename buffer
  40.         ;CALL    LINEINP
  41.         LD      A,pg3
  42.         CALL    selmem
  43.         LD      HL,tsavename;#C000
  44.         LD      DE,FNBUF
  45.         LD      BC,20
  46.         PUSH    BC
  47.         PUSH    HL
  48.         LDIR
  49.         POP     DE
  50.         POP     BC
  51. ;Length of buffer
  52.         LD      HL,NAMEBUF
  53.         LD      DE,#C000
  54.         LDIR
  55. ;Original contents of buffer
  56.         LD      HL,FNBUF+1 ;len
  57.         LD      E,(HL)
  58.         LD      D,0
  59.         INC     HL
  60.         ADD     HL,DE
  61.         LD      (HL),#FF
  62. ;FFh-terminated filename string
  63.         LD      A,pg6
  64.         CALL    selmem
  65.         LD      HL,FNBUF+2
  66.         ;jr $
  67.         LD      A,E
  68. ;<< v1.01  A = length of input
  69.         OR      A
  70.         SCF
  71. ; IF it's 0, then no name was input.
  72.         RET     NZ
  73.         CCF ;>> v1.01
  74.         RET
  75. tsavename
  76.         db 0
  77.         db tsavename_end-(tsavename+2)
  78.         db "zsave.!"
  79. tsavename_end
  80.  
  81. MORE
  82. ;Rather than print [MORE], use a flashing cursor.
  83.         PUSH    HL
  84.         ;LD A,pg7
  85.         CALL selmemscr
  86.         LD      HL,#DAFF
  87. ;Bottom right hand corner
  88.         LD      A,(HL)
  89.         XOR     #C0
  90. ;Bright and flashing!
  91.         LD      (HL),A
  92. MORE1
  93.         CALL    CON6
  94.         OR      A
  95.         JR      Z,MORE1
  96.         LD      A,(HL)
  97.         XOR     #C0
  98. ;Remove the bright/flashing attribute
  99.         LD      (HL),A
  100.         LD      A,pg6
  101.         CALL    selmem
  102.         POP     HL
  103. RES_MORE
  104.  
  105.         PUSH    HL
  106.         LD      A,31
  107.         LD      HL,lwtop
  108.         SUB     (HL)
  109. ;A = no. of scrolls to next [MORE]
  110.         LD      (scrls),A
  111.         POP     HL
  112.         INC     A
  113.         RET
  114.  
  115. UPCASEA
  116.         CP "a"
  117. ;CONVERT THE CHARACTER IN A TO UPPERCASE.
  118.         RET C
  119.         CP "z"+1
  120.         RET NC
  121.         RES 5,A
  122.         RET
  123.  
  124. LCASE
  125.         CP "A"
  126. ;convert the character in a to lowercase.
  127.         RET C
  128.         CP "Z"+1
  129.         RET NC
  130. ;<< v0.02 >> use RET NC not RET C, it might help :-)
  131.         SET 5,A
  132.         RET
  133. ;
  134. CON6
  135.         PUSH    BC
  136. ;IF THERE IS NO KEYPRESS, A:=0 ELSE A:=KEYPRESS
  137.         PUSH    DE
  138.         PUSH    HL
  139.         EI
  140.         CALL    PUTCUR
  141.        if 1
  142.         GET_KEY
  143.         cp key_del
  144.         ld c,'G'-64;RDEL    ;^G
  145.         jr z,CON6_keyc
  146.         cp key_left
  147.         ld c,'H'-64;MOVLT   ;^H
  148.         jr z,CON6_keyc
  149.         cp key_right
  150.         ld c,'I'-64;MOVRT   ;^I
  151.         jr z,CON6_keyc
  152.         cp key_backspace
  153.         ld c,'L'-64;DELETE  ;^L
  154.         jr z,CON6_keyc
  155.         cp key_enter
  156.         ld c,'M'-64;FINISH  ;^M
  157.         jr z,CON6_keyc
  158.         cp key_end
  159.         ld c,'N'-64;LINEOL  ;^N
  160.         jr z,CON6_keyc
  161.         ld c,a
  162. CON6_keyc
  163.         ld a,c
  164.         or a
  165.         jr nz,CON6X2
  166.        else
  167.         XOR     A      ;L mode
  168.         LD      IY,#5C3A
  169. ;IY required by subroutine
  170.         SET     3,(IY+1)
  171.         RES     5,(IY+2)
  172.         RES     3,(IY+2)
  173.         CALL    #10A8 ;Get keyboard character
  174.         JR      C,CON6X2
  175.        endif
  176. ;Input OK.
  177. ;Check specially for BREAK ;FIXME
  178.         LD      BC,#FEFE
  179.         IN      A,(C) ;Port FEFE
  180.         CPL
  181.         AND     1 ;CAPS
  182.         JR      Z,CON6X2
  183.         LD      B,#7F
  184.         IN      A,(C)
  185.         CPL
  186.         AND     1
  187. ;1 => BREAK, 0 => no character.
  188. CON6X2
  189.         CALL    PUTCUR
  190.         POP     HL
  191.         POP     DE
  192.         POP     BC
  193.         RET
  194. ;
  195. PRINT
  196.         CALL    PUSHA
  197.         LD      C,E
  198.         LD      B,D
  199. PRI1
  200.         LD      A,(BC)
  201.         CP      "$"
  202.         JP      Z,POPA
  203.         LD      E,A
  204.         CALL    OPCHAR
  205.         INC     BC
  206.         JR      PRI1
  207. ;
  208. STRING_
  209.  
  210. ;PRINT THE CHARACTER IN E B TIMES.
  211.         PUSH    BC
  212. STRI_1
  213.         CALL    OPCHAR
  214.         DEC     B
  215.         JP      NZ,STRI_1
  216.         POP     BC
  217. ;
  218. OPCHAR
  219.  
  220.         CALL    PUSHA
  221.         PUSH    AF
  222.         ;LD A,pg7
  223.         CALL selmemscr
  224.         POP     AF
  225.         CALL    PR64
  226.         LD      A,pg6
  227.         CALL    selmem
  228.         JP      POPA
  229. ;
  230. ANYCHAR
  231.  
  232.         CALL    PUSHA
  233.         PUSH    AF
  234.         ;LD A,pg7
  235.         CALL selmemscr
  236.         POP     AF
  237.         CALL    PR64A
  238.         LD      A,pg6
  239.         CALL    selmem
  240.         JP      POPA
  241. ;
  242. PRINAT
  243.         DI
  244.         PUSH    AF
  245. ;Move cursor, limiting it to within the screen
  246.         PUSH    DE
  247.         LD      A,E
  248.         CP      64
  249.         JR      C,PRINA1
  250.         LD      A,63
  251. PRINA1
  252.         LD      A,D     ;Y
  253.         CP      32
  254.         JR      C,PRINA2
  255.         LD      A,31
  256. PRINA2
  257.         ADD     A,A     ;*2
  258.         LD      D,A
  259.         ADD     A,A     ;*4
  260.         ADD     A,D     ;*6
  261.         LD      D,A
  262.         LD      (XPOS),DE
  263.         POP     DE
  264.         POP     AF
  265.         RET
  266. ;
  267. HIVON
  268.         PUSH    AF
  269.         XOR     A
  270.         DEC     A
  271.         LD      (HVF),A
  272.         POP     AF
  273.         RET
  274. ;
  275. HIVOFF
  276.  
  277.         PUSH    AF
  278.         XOR     A
  279.         LD      (HVF),A
  280.         POP     AF
  281.         RET
  282. ;
  283. CURON
  284.         PUSH    AF
  285.         XOR     A
  286.         DEC     A
  287.         LD      (CURFLG),A
  288.         POP     AF
  289.         RET
  290. ;
  291. CUROFF
  292.  
  293.         PUSH    AF
  294.         XOR     A
  295.         LD      (CURFLG),A
  296.         POP     AF
  297.         RET
  298. ;
  299. ZIBUF
  300.         DEFW 0
  301. ;Z-address of input buffer
  302. INPPOS
  303.         DEFW 0
  304. ;X,Y of start of input buffer
  305. MAXL
  306.         DEFB 0 ;Max input length
  307. ACTL
  308.         DEFB 0 ;Actual input length
  309. CURP
  310.         DEFB 0
  311. ;Cursor position
  312. OFRAME
  313.         DEFB 0
  314. ;Last value of FRAMES ticker
  315. TIMEV
  316.         DEFW 0
  317. ;Countdown in 50ths of a second to timeout
  318.  
  319. ;Initialise timed input
  320. INITIME
  321.         PUSH    HL
  322.         LD      H,D
  323. ;DE = timeout in tenths of a second
  324.         LD      L,E
  325.         ADD     HL,HL
  326.         ADD     HL,HL
  327.         ADD     HL,DE
  328. ;HL = timeout in 50ths of a second
  329.         LD      (TIMEV),HL
  330.         ;LD      A,(FRAMES)
  331.        push bc
  332.        push de
  333.        OS_GETTIMER ;dehl
  334.        ld a,l;e
  335.        pop de
  336.        pop bc
  337.         LD      (OFRAME),A
  338.         POP     HL
  339.         RET
  340.  
  341. ;Read character, with timeout
  342. RCHAR
  343.         CALL    INITIME
  344.         CALL    RCHAR1
  345.         AND     A
  346.         RET     Z
  347.         PUSH    AF
  348.         CALL    RES_MORE
  349.         POP     AF
  350. XLTCHR
  351.         LD      B,A
  352. ;Translate Spectrum control codes
  353. ;to Z-machine control codes, B=code to do.
  354.         LD      HL,XLTAB
  355. XLTLP
  356.         LD      A,(HL)
  357.         INC     HL
  358.         INC     HL
  359.         OR      A
  360.         JR      Z,XLTEND
  361.         CP      B
  362.         JR      NZ,XLTLP
  363.         DEC     HL
  364.         LD      A,(HL)
  365.         RET
  366. ;
  367. XLTEND
  368.         LD      A,B
  369.         RET
  370.  
  371. ;Translation table: Spectrum control codes to Z-machine
  372. XLTAB
  373.         DEFB 12,8    ;Delete
  374.         DEFB 8,131   ;Left
  375.         DEFB 9,132   ;Right
  376.         DEFB 11,129  ;Up
  377.         DEFB 10,130  ;Down
  378.         DEFB 0       ;End of table
  379. ;
  380. RCHAR1
  381.        push bc
  382.        push de
  383.        OS_GETTIMER ;dehl
  384.        ld a,l;e
  385.        pop de
  386.        pop bc
  387.         LD      HL,OFRAME
  388. ;Has the 50Hz counter changed?
  389.         ;LD      A,(FRAMES)
  390.         CP      (HL)
  391.         JR      Z,RCHAR2
  392.         LD      (HL),A
  393.         LD      HL,(TIMEV)
  394. ;IF time is 0, don't time out.
  395.         LD      A,H
  396.         OR      L
  397.         JR      Z,RCHAR2
  398.         DEC     HL
  399.         LD      A,H
  400.         OR      L
  401.         RET     Z
  402. ;Return with timeout
  403.         LD      (TIMEV),HL
  404. RCHAR2
  405.         CALL    CON6
  406.         OR      A
  407.         RET     NZ
  408.         JR      RCHAR1
  409. ;
  410. LINEINP
  411.         ;jr $
  412. ;Line input into buffer at HL, timeout DE (0 for none)
  413.         CALL    CURON
  414.         CALL    INITIME
  415.         LD      (ZIBUF),HL
  416.         LD      HL,(lwx)
  417.         EX      DE,HL
  418.         CALL    PRINAT
  419.         EX      DE,HL
  420.         LD      A,(cwin)
  421.         OR      A
  422.         JR      NZ,LINEI1
  423.         LD      HL,(uwx)
  424. LINEI1
  425.         LD      (INPPOS),HL
  426.         LD      HL,(ZIBUF)
  427.         CALL    peek64
  428.         LD      (MAXL),A
  429.         INC     HL
  430.         CALL    peek64
  431.         LD      (ACTL),A
  432.         LD      (CURP),A
  433.  
  434. ;IF the game has printed text already, step back past it & reset
  435. ;our X,Y.
  436.         LD      B,A  ;CURP
  437.         LD      A,(INPPOS)
  438.         SUB     B
  439.         LD      (INPPOS),A
  440. ;Input is now at correct coordinates.
  441.         JR      INPUT
  442.  
  443. COMTAB
  444.         DEFW TIMED0  ;Timeout
  445.         DEFW INPUTB  ;^A (ignore BREAK)
  446.         DEFW INPUT3  ;^B
  447.         DEFW INPUT3  ;^C
  448.         DEFW INPUT3  ;^D
  449.         DEFW INPUT3  ;^E
  450.         DEFW INPUT3  ;^F
  451.         DEFW RDEL    ;^G
  452.         DEFW MOVLT   ;^H
  453.         DEFW MOVRT   ;^I
  454.         DEFW INPUT3  ;^J
  455.         DEFW INPUT3  ;^K
  456.         DEFW DELETE  ;^L
  457.         DEFW FINISH  ;^M
  458.         DEFW LINEOL  ;^N
  459.         DEFW RDEL    ;^O
  460.         DEFW INPUT3  ;^P
  461.         DEFW INPUT3  ;^Q
  462.         DEFW INPUT3  ;^R
  463.         DEFW INPUT3  ;^S
  464.         DEFW INPUT3  ;^T
  465.         DEFW INPUT3  ;^U
  466.         DEFW INPUT3  ;^V
  467.         DEFW INPUT3  ;^W
  468.         DEFW INPUT3  ;^X
  469.         DEFW INPUT3  ;^Y
  470.         DEFW INPUT3  ;^Z
  471.         DEFW INPUT3  ;^[
  472.         DEFW INPUT3  ;^\
  473.         DEFW INPUT3  ;^]
  474.         DEFW INPUT3  ;^^
  475.         DEFW INPUT3  ;^_
  476.  
  477. INPUT
  478.         CALL    RCHAR1
  479. ;Get character with timer
  480.  
  481. INPUT2
  482.         CALL    MOVXY
  483. ;Move cursor to the right place
  484.         CP " "
  485.         JP      NC,INPUT3
  486.  
  487.         LD      L,A ;Command characters
  488.         LD      H,0
  489.         ADD     HL,HL
  490.         LD      DE,COMTAB
  491.         ADD     HL,DE
  492.         LD      D,(HL)
  493.         INC     HL
  494.         LD      H,(HL)
  495.         LD      L,D
  496.         JP      (HL)
  497.  
  498. TIMED0
  499.         LD      B,0 ;Input timed out!
  500.         JR      CEND
  501.  
  502. FINISH
  503.         LD      B,#0A
  504.         JR      CEND
  505.  
  506. ABANDON
  507.  
  508.         LD      B,27
  509.         JR      CEND
  510.  
  511. CEND
  512.         PUSH    BC
  513. ;B = terminating character
  514.         LD      HL,(INPPOS)
  515.         LD      A,(cwin)
  516.         OR      A
  517.         JR      Z,CENDU
  518.         LD      (lwx),HL
  519.         JR      CENDC
  520.  
  521. CENDU
  522.         LD      (uwx),HL
  523. CENDC
  524.  
  525.        ;LD      HL,#0D
  526.        ;CALL    ZXZCHR
  527.         LD      A,(ACTL)
  528.         LD      B,A
  529.         LD      HL,(ZIBUF)
  530.         INC     HL
  531.         CALL    ZXPOKE
  532. LCLP
  533.         INC     HL ;Force it to lowercase
  534.         CALL    peek64
  535.         PUSH    AF
  536.         PUSH    BC
  537.         PUSH    DE
  538.         PUSH    HL
  539.         LD      L,A
  540.         LD      H,0
  541.         CALL    ts_char
  542.         POP     HL
  543.         POP     DE
  544.         POP     BC
  545.         POP     AF
  546.         CALL    LCASE
  547.         CALL    ZXPOKE
  548.         DJNZ    LCLP
  549.         CALL    CUROFF
  550.         PUSH    AF
  551.         CALL    RES_MORE
  552.         POP     AF
  553.         POP     BC
  554.         SCF
  555.         RET
  556.  
  557. DELETE
  558.         LD      A,(CURP)
  559.         OR      A
  560. ;DEL LEFT/^H. AT THE LH END OF THE LINE?
  561.         CALL    Z,CHIME
  562.         JP      Z,INPUT
  563.  
  564.         LD      D,A
  565.         LD      A,(ACTL)
  566.         CP      D
  567. ;LAST CHARACTER SPECIAL CASE
  568.         JP      Z,DELLAST
  569.  
  570.         CALL    GETPPOS
  571. ;DE=NEXT CHARACTER
  572.         LD      D,H
  573.         LD      E,L
  574.         DEC     HL
  575. ;HL=THIS CHARACTER
  576.         LD      A,(CURP)
  577.         LD      B,A
  578.         LD      A,(ACTL)
  579.         SUB     B
  580. ;Length of line - cursor pos = no. to shift
  581. ;B= no, to shift
  582.         LD      B,A
  583. DEL1
  584.         EX      DE,HL
  585.         CALL    peek64
  586.         EX      DE,HL
  587.         CALL    ZXPOKE
  588.         INC     HL
  589.         INC     DE
  590.         DJNZ    DEL1
  591.         LD      HL,ACTL
  592.         DEC     (HL)
  593.         LD      HL,CURP
  594.         DEC     (HL)
  595.         CALL    UPDLN  ;UPDATE LINE
  596.         CALL    MOVXY
  597.         JP      INPUT
  598.  
  599. DELLAST
  600. ;Delete last character
  601.         LD      HL,ACTL
  602.         DEC     (HL)
  603.         LD      HL,CURP
  604.         DEC     (HL)
  605.         CALL    UPDLN
  606.         CALL    MOVXY
  607.         JP      INPUT
  608.  
  609. RDEL
  610.         LD      A,(CURP) ;Delete right
  611.         LD      HL,ACTL
  612.         CP      (HL)
  613.         CALL    Z,CHIME
  614.         JP      Z,INPUT
  615.         CALL    GETPPOS
  616.         LD      D,H
  617.         LD      E,L
  618.         INC     DE   ;HL=THIS CHARACTER
  619.         LD      A,(CURP)
  620.         LD      B,A
  621.         LD      A,(ACTL)
  622.         SUB     B
  623. ;No. of characters to swallow
  624.         DEC     A
  625.         JR      Z,RDEL2
  626. ;No characters need swallowing
  627.         LD      B,A
  628. RDEL1
  629.         EX      DE,HL
  630.         CALL    peek64
  631.         EX      DE,HL
  632.         CALL    ZXPOKE
  633.         INC     HL
  634.         INC     DE
  635.         DJNZ    RDEL1
  636. RDEL2
  637.         LD      HL,ACTL
  638.         DEC     (HL)
  639.         CALL    UPDLN ;UPDATE LINE
  640.         CALL    MOVXY
  641.         JP      INPUT
  642.  
  643. CUT
  644.         CALL    DEL2E ;Delete line
  645.         JP      DEL2BOL
  646.  
  647. DEL2EOL
  648.         CALL    DEL2E
  649. ;Delete to end of line
  650.         JP      INPUT
  651.  
  652. DEL2E
  653.         CALL    GETPPOS
  654.         LD      A,(CURP)
  655.         LD      (ACTL),A
  656.         CALL    UPDLN
  657.         CALL    MOVXY
  658.         JP      INPUT
  659.  
  660. DEL2BOL
  661. ;Delete to start of line
  662.         CALL    GETPPOS
  663.         LD      DE,(ZIBUF)
  664.         INC     DE
  665.         INC     DE
  666.         LD      A,(CURP)
  667.         LD      B,A
  668.         LD      A,(ACTL)
  669.         SUB     B
  670.         LD      C,0
  671.         LD      B,A
  672. ;B = no. of characters to move to start
  673.         OR      A
  674.         JR      Z,DEL4B
  675. DEL3B
  676.         CALL    peek64
  677.         EX      DE,HL
  678.         CALL    ZXPOKE
  679.         EX      DE,HL
  680.         INC     HL
  681.         INC     DE
  682.         INC     C
  683.         DJNZ    DEL3B
  684. DEL4B
  685.         LD      A,C
  686.         LD      (ACTL),A
  687.         XOR     A
  688.         LD      (CURP),A
  689.         CALL    UPDLN
  690.         CALL    MOVXY
  691.         JP      INPUT
  692.  
  693. INPUTB
  694.         LD A," " ;BREAK -> SPACE
  695. INPUT3
  696.         CALL    INSERT_
  697. ;INSERT a simple character
  698.         CALL    UPDLN
  699.         CALL    MOVXY
  700.         JP      INPUT
  701.  
  702. yil
  703.         DEFB 0
  704. yes_i_live
  705.         CALL    PUSHA
  706.         LD      A,(yil)
  707.         OUT     (254),A
  708.         INC     A
  709.         AND     7
  710.         LD      (yil),A
  711. yil1
  712.         CALL    CON6
  713.         OR      A
  714.         JR      Z,yil1
  715.         JP      POPA
  716.  
  717. CHAR
  718.         DEFB    0
  719.  
  720. INSERT_
  721.         LD      (CHAR),A
  722. ;INSERT A CHARACTER
  723.         LD      A,(ACTL)
  724.         LD      HL,MAXL
  725.         CP      (HL)
  726. ;IS LENGTH=MAXIMUM?
  727.         CALL    Z,CHIME
  728. ;IF YES, BLEEP; DISALLOW
  729.         RET     Z
  730.  
  731.         LD      HL,CURP
  732.         CP      (HL)
  733. ;IS THIS THE LAST CHARACTER?
  734.         JR      NZ,INSERT1
  735. ;SPECIAL CASE IF JUST ADDING THE LAST CHARACTER
  736.         CALL    GETLPOS
  737.         LD      A,(CHAR)
  738.         CALL    ZXPOKE
  739.         LD      A,(ACTL)
  740.         INC     A
  741.         LD      (ACTL),A
  742.         LD      (CURP),A
  743.         RET
  744.  
  745. INSERT1
  746.         CALL    GETPPOS
  747. ;HL=CURRENT POSITION
  748.         CALL    peek64
  749. ;INSERT, and move up
  750.         LD      C,A
  751.         LD      A,(CURP)
  752.         LD      B,A
  753.         LD      A,(ACTL)
  754.         SUB     B
  755.         LD      B,A
  756. ;B = no. of chars to move up
  757. INSERT2
  758.         CALL    peek64
  759.         PUSH    AF
  760.         LD      A,C
  761.         CALL    ZXPOKE
  762.         POP     AF
  763.         LD      C,A
  764.         INC     HL
  765.         DJNZ    INSERT2
  766.         CALL    GETPPOS
  767.         LD      A,(CHAR)
  768.         CALL    ZXPOKE
  769. ;STORE NEW CHARACTER
  770.         LD      HL,CURP
  771.         INC     (HL)
  772.         LD      HL,ACTL
  773.         INC     (HL)
  774.         RET
  775.  
  776. GETPPOS
  777.         PUSH    DE
  778.         LD      DE,(ZIBUF)
  779.         INC     DE
  780.         INC     DE
  781.         LD      HL,(CURP)
  782.         LD      H,0
  783.         ADD     HL,DE   ;HL=CURSOR POS.
  784.         POP     DE
  785.         RET
  786.  
  787. MOVLT
  788.         LD      A,(CURP)
  789.         OR      A
  790.         JP      Z,INPUT
  791.         DEC     A
  792.         LD      (CURP),A
  793.         CALL    MOVXY
  794.         JP      INPUT
  795.  
  796. MOVRT
  797.         LD      A,(CURP)
  798.         LD      HL,ACTL
  799.         CP      (HL)
  800.         JP      Z,INPUT
  801.         INC     A
  802.         LD      (CURP),A
  803.         CALL    MOVXY
  804.         JP      INPUT
  805.  
  806. GETLPOS
  807.         PUSH    DE
  808.         LD      DE,(ZIBUF)
  809.         INC     DE
  810.         INC     DE
  811.         LD      HL,(ACTL)
  812.         LD      H,0
  813.         ADD     HL,DE
  814.         POP     DE
  815.         RET
  816.  
  817. MOVXY
  818.         CALL    PUSHA
  819.         LD      DE,(INPPOS)
  820.         LD      A,(CURP)
  821.         ADD     A,E
  822.         LD      E,A
  823. ;PRINT AT CURSOR POSITION.
  824.         CALL    PRINAT
  825.         JP      POPA
  826.  
  827. UPDLN
  828.         CALL    PUSHA
  829.         LD      DE,(INPPOS)
  830.         CALL    PRINAT
  831.         LD      HL,(ZIBUF)
  832.         INC     HL
  833.         INC     HL
  834.         LD      A,(ACTL)
  835.         OR      A
  836.         JR      Z,UPDLN3
  837.         LD      B,A
  838. UPDLN1
  839.         CALL    peek64
  840.         LD      E,A
  841.         INC     HL
  842.         CALL    ANYCHAR
  843.         DJNZ    UPDLN1
  844. UPDLN3
  845.         LD      A,(MAXL)
  846.         LD      HL,ACTL
  847.         SUB     (HL)  ;A=UNUSED CHARS
  848.         OR      A
  849.         JP      Z,POPA
  850.         LD      B,A
  851.         LD      E," "
  852. UPDLN4
  853.         CALL    OPCHAR
  854.         DJNZ    UPDLN4
  855.         JP      POPA
  856.  
  857. LINEOL
  858.         LD      A,(CURP)
  859.         OR      A
  860.         JR      Z,EOL
  861.         XOR     A
  862.         LD      (CURP),A
  863.         CALL    MOVXY
  864.         JP      INPUT
  865.  
  866. EOL
  867.         LD      A,(ACTL)
  868.         LD      (CURP),A
  869.         CALL    MOVXY
  870.         JP      INPUT
  871.  
  872. WRAP
  873.         DEFB 0 ;Wrap at end of line?
  874. XPOS
  875.         DEFB 0 ;Cursor X, characters
  876. YPOS
  877.         DEFB 0 ;Cursor Y, pixels
  878. SCRATCH
  879.         DEFB 0 ;Used while scrolling
  880. OVER
  881.         DEFB 0 ;Overprinting on?
  882. HVF
  883.         DEFB 0 ;High (reversed) video on?
  884. ITF
  885.         DEFB 0 ;Underlining on?
  886. CURFLG
  887.         DEFB 0
  888.  
  889. PUTCUR
  890.         CALL    PUSHA
  891.         LD      A,(CURFLG)
  892.         OR      A
  893.         JP      Z,POPA
  894.         XOR     A
  895.         DEC     A
  896.         LD      (OVER),A
  897.         ;LD A,pg7
  898.         CALL selmemscr
  899.         LD      A,"_"
  900.         CALL    OPC64
  901.         LD      A,pg6
  902.         CALL    selmem
  903.         JP      POPA
  904.  
  905. DOLF
  906.         LD      A,(YPOS)
  907.         ADD     A,6
  908.         LD      (YPOS),A
  909.         JR      NOCR1
  910.  
  911. PR64
  912.         LD      A,E
  913.         CP      #0D
  914.         JR      Z,DOCR
  915.         CP      #0A
  916.         JR      Z,DOLF
  917.         CP      #07
  918.         JP      Z,CHIME
  919.         CP      #20
  920.         RET     C
  921.         CP      #E0
  922.         RET     NC
  923. PR64A
  924.         XOR     A
  925.         LD      (OVER),A
  926.         LD      A,(HVF)
  927.         OR      A
  928.         JR      Z,PR64B
  929.         LD      A,143
  930.         PUSH    DE
  931.         CALL    OPC64
  932.         POP     DE
  933.         LD      A,#FF
  934. ;The text character will be drawn overprinted
  935.         LD      (OVER),A
  936. PR64B
  937.         LD      A,(ITF)
  938.         OR      A
  939.         JR      Z,PR64C
  940.         LD      A,"_"
  941.         PUSH    DE
  942.         CALL    OPC64
  943.         POP     DE
  944.         LD      A,#FF
  945.         LD      (OVER),A
  946. PR64C
  947.         LD      A,(XPOS)
  948.         CP      #40
  949.         JR      C,GOODX
  950. BADPARS
  951.         ld hl,0x0019
  952.         QUIT
  953.         ;RST     8
  954.         ;DEFB #19 ;Parameter error
  955.  
  956. GOODX
  957.         LD      A,(YPOS)
  958.         CP      191
  959.         JR      NC,BADPARS
  960.         LD      A,E ;A=character
  961.         PUSH    HL
  962.         PUSH    BC
  963.         CALL    OPC64 ;Print character
  964.         POP     BC
  965.         POP     HL
  966.         LD      A,(XPOS)
  967.         INC     A
  968.         LD      (XPOS),A
  969.         CP      #40     ;Auto CRLF?
  970.         JR      NZ,NOCR1
  971.         LD      A,(WRAP) ;Wrap text at EOL?
  972.         OR      A
  973.         JR      NZ,WRAP1
  974.         LD      A,(XPOS)
  975.         DEC     A
  976.         LD      (XPOS),A
  977.         RET
  978.  
  979. WRAP1
  980.         LD      A,(YPOS)
  981.         ADD     A,6
  982.         LD      (YPOS),A
  983. DOCR
  984.         XOR     A
  985.         LD      (XPOS),A
  986. NOCR1
  987.         LD      A,(YPOS)
  988.         CP      #BB
  989.         RET     C
  990.         PUSH    HL
  991.         PUSH    BC
  992.         CALL    SCROLL
  993.         POP     BC
  994.         POP     HL
  995.         LD      A,#BA
  996.         LD      (YPOS),A
  997.         XOR     A
  998.         LD      (XPOS),A
  999.         RET
  1000.  
  1001. SCRL_N
  1002.         CALL    PUSHA
  1003.         PUSH    AF
  1004.         ;LD A,pg7
  1005.         CALL selmemscr
  1006.         POP     AF
  1007.         CALL    RFCD5
  1008.         LD      A,pg6
  1009.         CALL    selmem
  1010.         JP      POPA
  1011.  
  1012. ZAPLN
  1013.         PUSH    BC
  1014. ;Clear a screen line (line passed in B)
  1015.         LD      A,B
  1016.         ADD     A,A
  1017.         ADD     A,A
  1018.         ADD     A,B
  1019.         ADD     A,B
  1020.         LD      (SCRATCH),A
  1021.         LD      B,6
  1022. ZAPL1
  1023.         PUSH    BC
  1024.         LD      A,(SCRATCH)
  1025.         CALL    YCOORD
  1026.         LD      B,32
  1027. ZAPL2
  1028.         LD      (HL),0
  1029.         INC     HL
  1030.         DJNZ    ZAPL2
  1031.         LD      A,(SCRATCH)
  1032.         INC     A
  1033.         LD      (SCRATCH),A
  1034.         POP     BC
  1035.         DJNZ    ZAPL1
  1036.         POP     BC
  1037.  
  1038.         RET
  1039.  
  1040. SCROLL
  1041.         DI ;???
  1042.         XOR     A ;Scroll from line 0
  1043. RFCD5
  1044.         PUSH    AF
  1045.         ADD     A,A
  1046.         LD      B,A
  1047.         ADD     A,A
  1048.         ADD     A,B
  1049.         LD      (SCRATCH),A
  1050.         LD      B,6
  1051. RFCDF
  1052.         PUSH    BC
  1053.         LD      A,(SCRATCH)
  1054.         CALL    YCOORD
  1055.         EX      DE,HL
  1056.         LD      A,(SCRATCH)
  1057.         ADD     A,6
  1058.         CALL    YCOORD
  1059.         LD      BC,32
  1060.         LD      A,(HL)
  1061.         LD      (DE),A
  1062.         LDIR
  1063.         LD      A,(SCRATCH)
  1064.         INC     A
  1065.         LD      (SCRATCH),A
  1066.         POP     BC
  1067.         DJNZ    RFCDF   ;$-1F
  1068.         POP     AF
  1069.         INC     A
  1070.         CP      #1F
  1071.         JR      NZ,RFCD5 ;$-2F
  1072.         LD      A,#BA
  1073. RFD08
  1074.         PUSH    AF
  1075.         CALL    YCOORD
  1076.        ;PUSH    HL
  1077.        ;POP     DE
  1078.        LD D,H
  1079.        LD E,L
  1080.         INC     DE
  1081.         LD      BC,31
  1082.         LD      (HL),0
  1083.         LDIR
  1084.         POP     AF
  1085.         INC     A
  1086.         CP      #C0
  1087.         JR      NZ,RFD08 ;$-12
  1088.         EI ;???
  1089.         RET
  1090.  
  1091. OPC64
  1092.         LD      (SCRATCH),A
  1093.         SRL     A
  1094.         LD      L,A
  1095.         LD      H,0
  1096.         ADD     HL,HL
  1097.        ;PUSH    HL
  1098.        ;POP     BC
  1099.        LD B,H
  1100.        LD C,L
  1101.         ADD     HL,HL
  1102.         ADD     HL,BC
  1103.         LD      BC,FONT
  1104.         LD      A,(cfont)
  1105.         CP      3
  1106.         JR      NZ,GFD78
  1107.         LD      BC,FONT3
  1108. GFD78
  1109.         ADD     HL,BC
  1110.         EX      DE,HL
  1111.         XOR     A ;Counter 0-5.
  1112. RFD79
  1113.         PUSH    AF
  1114.         LD      B,A
  1115.         LD      A,(YPOS)
  1116.         ADD     A,B
  1117.         CALL    YCOORD
  1118. ;HL=address of screen line needed.
  1119.         LD      B,0
  1120.         LD      A,(XPOS)
  1121.         SRL     A ;Calculate X address.
  1122.         LD      C,A
  1123.         ADD     HL,BC
  1124.         LD      A,(SCRATCH)
  1125.         AND     1
  1126.         LD      B,A
  1127.         LD      A,(XPOS)
  1128.         AND     1
  1129.         XOR     B
  1130.         JR      NZ,RFDAB
  1131.         LD      A,(SCRATCH)
  1132.         AND     1
  1133.         JR      NZ,RFDA6
  1134.         LD      A,(DE)
  1135.         AND     #F0
  1136.         JR      RFDC6   ;L -> L
  1137.  
  1138. RFDA6
  1139.         LD      A,(DE)
  1140.         AND     #0F
  1141.         JR      RFDC6   ;R -> R
  1142.  
  1143. RFDAB
  1144.         LD      A,(SCRATCH)
  1145.         AND     1
  1146.         JR      Z,RFDBD
  1147. ;Character wants to go R -> L
  1148.         LD      A,(DE)
  1149.         SLA     A
  1150.         SLA     A
  1151.         SLA     A
  1152.         SLA     A
  1153.         JR      RFDC6
  1154.  
  1155. RFDBD
  1156.         LD      A,(DE)
  1157. ;Character wants to go L -> R
  1158.         SRL     A
  1159.         SRL     A
  1160.         SRL     A
  1161.         SRL     A
  1162. RFDC6
  1163.         LD      B,A
  1164.         LD      A,(OVER)
  1165.         OR      A
  1166.         JR      Z,RFDD3
  1167. ;IF 'over', XOR the data in.
  1168.         LD      A,B
  1169.         XOR     (HL)
  1170.         LD      (HL),A
  1171.         JR      NXCHR
  1172.  
  1173. RFDD3
  1174.         LD      A,(XPOS)
  1175.         AND     1
  1176.         JR      NZ,RFDDF
  1177.         LD      A,(HL)
  1178. ;Right-hand character
  1179.         AND     #0F
  1180.         JR      RFDE2
  1181.  
  1182. RFDDF
  1183.         LD      A,(HL)
  1184.         AND     #F0  ;Left-hand character
  1185. RFDE2
  1186.         OR      B
  1187.         LD      (HL),A
  1188. NXCHR
  1189.         INC     DE
  1190.         POP     AF
  1191.         INC     A
  1192.         CP      6
  1193.  
  1194.         RET     Z
  1195.  
  1196.         JR      RFD79 ;$-70
  1197.  
  1198. YCOORD
  1199.         LD      B,A
  1200. ;Convert Y coordinates to screen address
  1201.         AND     #38
  1202.         SLA     A       ;/2
  1203.         SLA     A       ;/4
  1204.         LD      L,A
  1205.         LD      A,B
  1206.         AND     7
  1207.         LD      H,A
  1208.         LD      A,B
  1209.         AND     #C0
  1210.         SRL     A
  1211.         SRL     A
  1212.         SRL     A
  1213.         OR      H
  1214.         LD      H,A
  1215.         LD      BC,#C000
  1216.         ADD     HL,BC
  1217.         RET
  1218.  
  1219. ;This font descriptor record is not used by anything,
  1220. ;but in case I ever write
  1221. ;a font editor for 64-column fonts, this is where it should look
  1222. ;:-)
  1223.         DEFB "64FONT->"
  1224.         DEFB 1    ;Descriptor type 1
  1225.         DEFB #20
  1226. ;First character defined
  1227.         DEFB #E0
  1228. ;First character which is undefined
  1229. FONT    EQU $-96
  1230.  
  1231.         INCBIN "zxfont64.bin"
  1232. ;Programatically generated from FONT64.XBM
  1233.         DEFB "64FONT->"
  1234.         DEFB 1,#20,#E0
  1235. FONT3   EQU $-96
  1236.         INCBIN "zxfnt643.bin"
  1237. ;Generated from FONT64_3.XBM
  1238.