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 / EPSON / RTX141.LBR / RTX141.MZC / RTX141.MAC
Text File  |  2000-06-30  |  38KB  |  1,884 lines

  1.     title *** RTX RUNTIME SYSTEM ***                    :
  2.  
  3.  
  4.     .z80            ;set m80 for z80 ops
  5.  
  6. rtxver    equ    141        ;rtx version number
  7.  
  8.  
  9. ;
  10. ; print message & symbol at consol during assembly
  11.  
  12. print_sym macro message,symbol
  13.       .printx * message symbol *
  14.       endm
  15.  
  16.  
  17.     .sall            ;no macro expansion list
  18.     .sfcond            ;no false conditional list
  19.     page 56
  20.  
  21. ;************************************************************************
  22. ;*                                    *
  23. ;*  RTX Runtime accessories for PX-8                    *
  24. ;*                                    *
  25. ;*  This system is in two parts:                     *
  26. ;*   1) Loader to allocate user BIOS area, check CP/M revision and    *
  27. ;*    install the system with the correct jump table.            *
  28. ;*   2) The runtime system which is relocated into user BIOS.        *
  29. ;*                                    *
  30. ;************************************************************************
  31. ;*                                    *
  32. ;*  Revision history:                            *
  33. ;*    V1.0    30/6/85        First version put together.        *
  34. ;*    V1.1    1/7/85        Initial bugs fixed.            *
  35. ;*    V1.2    4/7/85        User BIOS allocation changed from auto    *
  36. ;*                to manual (via CONFIG) to eliminate an    *
  37. ;*                obscure problem on machines without an    *
  38. ;*                external RAM disk.            *
  39. ;*     (V1.3)            Digital clock added.            *
  40. ;*    V1.4    18/11/85    Terminal mode added, clock removed.    *
  41. ;*                                    *
  42. ;*    v1.41    11/30/86    Prgcal code added, continuious battery, *
  43. ;*                date and time added, terminal echo opt    *
  44. ;*                added.  Battery, Printer Setup and I/O    *
  45. ;*                byte setup deleted.  Misc format and     *
  46. ;*                assembly changes.  evd            *
  47. ;*                                    *
  48. ;************************************************************************
  49. ;
  50.     .xlist
  51.     if1
  52.      .printx **
  53.      .printx * RTX Loader *
  54.      .printx **
  55.     else
  56.      .printx **
  57.      .printx * Pass 2 *
  58.      .printx **
  59.     endif
  60.     .list
  61.     title    *** RTX LOADER PROGRAM ***                    :
  62.     page
  63. ;
  64. ubsize        equ    14
  65. ctrlesc        equ    0F1BAH
  66. userbios    equ    0F00BH
  67. ubend        equ    0EC00H
  68. ubstart        equ    ubend-(ubsize*256)
  69. rtxsize        equ    rtxend-rtxstart
  70. ;
  71. deleol        equ    5
  72. bs        equ    8
  73. lf        equ    10
  74. cls        equ    12
  75. cr        equ    13
  76. esc        equ    27
  77. term        equ    255
  78. ;
  79.     .phase    00100H
  80. ;
  81. loader:    ld    a,(userbios)    ;Check userbios size set correct
  82.     cp    ubsize
  83.     ld    de,ubmsg    ;If not, say so and quit
  84.     jp    nz,finish
  85. ;
  86. load20:    ld    hl,(ctrlesc)
  87.     ld    de,vermsg
  88. ;
  89.     ld    a,h        ;Check the contents of the CTRL/ESC
  90.     cp    039H        ;vector matches the correct value
  91.     jr    z,load30    ;for Rev.A (38F8H) or Rev.B (3970H)
  92.     cp    038H
  93.     jr    z,load40
  94.     jp    finish
  95. ;
  96. load30:    ld    a,l
  97.     cp    070H
  98.     jr    z,load50
  99.     jp    finish
  100. ;
  101. load40:    ld    a,l
  102.     cp    0F8H
  103.     jr    z,load50
  104.     jp    finish
  105. ;
  106. load50:    ld    bc,rtxsize    ;Relocate RTX into user BIOS
  107.     ld    de,ubstart
  108.     ld    hl,rtxtop
  109.     ldir
  110. ;
  111.     ld    a,(ctrlesc)    ;Relocate correct system jump table into
  112.     cp    070H        ;user BIOS depending on version
  113.     jr    z,load60
  114.     ld    hl,revatbl
  115.     jr    load70
  116. load60:    ld    hl,revbtbl
  117. load70:    ld    de,jumptbl
  118.     ld    bc,revbtbl-revatbl
  119.     ldir
  120. ;
  121.     ld    hl,(ctrlesc)    ;Save existing CTRL/ESC vector
  122.     ld    (sbrwrk),hl
  123.     ld    hl,ubstart    ;Set up CTRL/ESC to point to RTX
  124.     ld    (ctrlesc),hl
  125. ;
  126.     ld    de,okmsg    ;And say we're done
  127. ;
  128. finish:    ld    c,9
  129.     jp    5
  130. ;
  131. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  132. ;
  133. revatbl:            ;System call table for Rev.A
  134. ;
  135.     jp    035D8H    ;const
  136.     jp    035FEH    ;conin
  137.     jp    0363FH    ;conout
  138.     jp    03CA7H    ;rsopen
  139.     jp    03C3AH    ;opnprinter
  140.     jp    04535H    ;x63c1a
  141.     jp    04391H    ;advcrt
  142.     jp    0300FH    ;readram
  143.     jp    05B4FH    ;xsysscrn
  144.     jp    05BB5H    ;xusrscrn
  145.     jp    01046H    ;blkflsh
  146.     jp    03CD6H    ;rsiox
  147.     jp    0420Dh    ;timdat
  148. ;
  149. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  150. ;
  151. revbtbl:            ;System call table for Rev.B
  152. ;
  153.     jp    03647H    ;const
  154.     jp    0366DH    ;conin
  155.     jp    036AEH    ;conout
  156.     jp    03D42H    ;rsopen
  157.     jp    03CD5H    ;opnprinter
  158.     jp    0459DH    ;x63c1a
  159.     jp    04416H    ;advcrt
  160.     jp    03014H    ;readram
  161.     jp    05B9DH    ;xsysscrn
  162.     jp    05C03H    ;xusrscrn
  163.     jp    00F67H    ;blkflsh
  164.     jp    03D71H    ;rsiox
  165.     jp    04299h    ;timdat
  166. ;
  167. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  168. ;
  169. ubmsg:    'The user BIOS area is not set correctly.',cr,lf
  170.     'Use the CONFIG program to set '
  171.     ubsize/10+'0',ubsize mod 10 +'0',' pages '
  172.     'of user BIOS before running RTX.',cr,lf,'$'
  173. ;
  174. vermsg:    'RTX already installed, or wrong CP/M version in use.',cr,lf,'$'
  175. ;
  176. okmsg:    cls
  177.     '   PX-8 Runtime Accessories System, Version '
  178.     (rtxver/100+'0'),'.'
  179.     ((rtxver mod 100)/10)+'0'
  180.     ((rtxver mod 100) mod 10)+'0',cr,lf
  181.     '   RTX (c) 1985 AJF, Epson (UK) Ltd., PrgCal (c) 1986 EVD',cr,lf,lf
  182.     '   RTX is now installed in the user BIOS area.',cr,lf
  183.     '   Be sure to use the "Remove RTX from memory" option before',cr,lf
  184.     '   reducing the user BIOS size.',cr,lf,'$'
  185. ;
  186. ;==============================================================================
  187. ;==============================================================================
  188. ;
  189.     title    *** RTX RUNTIME SYSTEM ***                    :
  190.     page
  191. ;
  192. rtxtop:
  193. ;
  194.     .dephase
  195.     .phase    ubstart
  196. ;
  197. ;------------------------------------------------------------------------------
  198. ;
  199.     .xlist
  200.     if1
  201.      .printx **
  202.      .printx * RTX Main Menu *
  203.      .printx **
  204.     endif
  205.     .list
  206.     subttl    Main menu and entry/exit section
  207.     page
  208. ;
  209. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  210. ;
  211. modefg        equ    0F0B8H
  212. lsfkdsp        equ    0F2CFH
  213. bflshdt        equ    0F335H
  214. btryfg        equ    0F0D8H
  215. ypofst        equ    0F0DAH
  216. ;
  217. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  218. ;
  219. rtxstart:
  220.     ld    hl,modefg    ;If MODE is system display, password etc.
  221.     ld    a,(hl)        ;then no entry to RTX
  222.     and    027H
  223.     ret    nz
  224.     set    2,(hl)        ;Else set system display flag
  225.     ld    a,8
  226.     ld    (lsfkdsp),a    ;No function key display
  227.     xor    a
  228.     call    blkflsh        ;No block flash
  229.     call    xsysscrn    ;Change from user screen to system screen
  230. ;
  231. restrt:    ld    hl,menumsg    ;Print main menu
  232.     call    stout1
  233.     call    hdline
  234. ;
  235. ent10:    call    getkey        ;Get keystroke
  236.     jp    z,exit        ;If Z set, then power off/fail
  237.     cp    esc
  238.     jp    z,exit
  239.     cp    '1'
  240.     jr    c,ent10
  241.     cp    '7'
  242.     jr    nc,ent10
  243.     sub    030H
  244.  
  245.     dec    a
  246.     jp    z,direc        ;Ram disk directory
  247.     dec    a
  248.     jp    z,pcal        ;prgcal
  249.     dec    a
  250.     jp    z,rs232        ;RS-232 setup
  251.     dec    a
  252.     jp    z,ramed        ;RAM editor
  253.     dec    a
  254.     jp    z,terminal    ;Terminal
  255.     jp    unhook        ;else delete RTX
  256. ;
  257. exit:    ld    hl,extmsg    ;System screen cursor on
  258.     call    stout1
  259.     call    xusrscrn    ;Change back to user screen
  260.     ld    a,(bflshdt)
  261.     call    blkflsh        ;Restore block flash if any
  262.     ld    hl,modefg    ;Clear system display flag
  263.     res    2,(hl)
  264.     ret            ;Finish
  265. ;
  266. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  267. ;
  268. menumsg:
  269.     cls,esc,'2','*** RTX v'
  270.     (rtxver/100+'0'),'.'        ;expand version number
  271.     ((rtxver mod 100)/10)+'0'
  272.     ((rtxver mod 100) mod 10)+'0'
  273.     ' ***',cr,lf,lf
  274.     '   1 - RAM disk directory       4 - RAM editor',cr,lf
  275.     '   2 - Programmer calculator    5 - Terminal',cr,lf
  276.     '   3 - RS-232 setup             6 - Remove RTX from memory',term
  277. ;
  278. extmsg:    esc,'3',term
  279.  
  280. ;
  281. ;------------------------------------------------------------------------------
  282. ;
  283.     .xlist
  284.     if1
  285.      .printx **
  286.      .printx * RTX RAM Disk *
  287.      .printx **
  288.     endif
  289.     .list
  290.     subttl    RAM disk directory module
  291.     page
  292. ;
  293. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  294. ;
  295. sektrk        equ    0F544H
  296. seksec        equ    0F546H
  297. dmaadr        equ    0F557H
  298. ysizeram    equ    0F6A8H
  299. ;
  300. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  301. ;
  302. direc:    ld    hl,dirmsg
  303.     call    stout1
  304.     call    hdline
  305.     call    crlf
  306.     ld    hl,(sektrk)    ;Store old track, sector and dma
  307.     ld    (oldtrk),hl
  308.     ld    hl,(dmaadr)
  309.     ld    (olddma),hl
  310.     ld    a,(seksec)
  311.     ld    (oldsec),a
  312.     ld    hl,0        ;Set track=0
  313.     ld    (sektrk),hl
  314.     ld    hl,rambuf    ;Set dma to RTX's ram buffer
  315.     ld    (dmaadr),hl
  316. ;
  317.     ld    a,(ysizeram)    ;Check RAM disk size
  318.     cp    64        ;If <64K,
  319.     ld    a,4        ;Then 4 sectors - 16 entries
  320.     jr    c,dir10
  321.     add    a,a        ;else 8 sectors - 32 entries
  322. dir10:    dec    a        ;Start with top sector
  323.     ld    (seksec),a    ;Store it
  324.     call    readram        ;Direct call to RAM disk read routine
  325.     ld    b,4        ;4 entries in this sector,
  326.     ld    hl,rambuf    ;starting at the bottom
  327. dir20:    ld    a,(hl)
  328.     cp    010H        ;If byte 0 less than 16 then valid file
  329.     jr    nc,dir40    ;else skip on
  330.     push    hl
  331.     ld    de,12
  332.     add    hl,de        ;Add 12
  333.     ld    a,(hl)        ;Check extent byte
  334.     or    a        ;If not zero,
  335.     pop    hl
  336.     jr    nz,dir40    ;then don't display
  337.     push    bc
  338.     push    hl
  339.     inc    hl
  340.     ld    b,8        ;Display 8 characters (filename)
  341.     call    stout2
  342.     ld    a,' '        ;Output a space
  343.     call    chrout
  344.     ld    b,3        ;Display 3 characters (type)
  345.     call    stout2
  346.     ld    b,4        ;Output 4 spaces
  347. dir30:    ld    a,' '
  348.     call    chrout
  349.     djnz    dir30
  350.     pop    hl
  351.     pop    bc
  352. dir40:    ld    de,020H        ;Increment HL for next FCB
  353.     add    hl,de
  354.     djnz    dir20        ;Decrement counter
  355.     ld    a,(seksec)
  356.     or    a        ;Done sector 0 yet?
  357.     jr    nz,dir10    ;No, go round again
  358. ;
  359.     ld    hl,(oldtrk)    ;Restore old tracks etc.
  360.     ld    (sektrk),hl
  361.     ld    hl,(olddma)
  362.     ld    (dmaadr),hl
  363.     ld    a,(oldsec)
  364.     ld    (seksec),a
  365. dir50:    call    getkey        ;Wait for ESC keypress before returning
  366.     jp    z,exit        ;to main menu
  367.     cp    esc
  368.     jr    nz,dir50
  369.     jp    restrt
  370. ;
  371. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  372. ;
  373. dirmsg:
  374.     cls,'*** RAM Disk Directory ***',term
  375. ;
  376. ;------------------------------------------------------------------------------
  377. ;
  378.  
  379.     subttl RTX PRGCAL module - 30 Nov 86  evd
  380.     page
  381.  
  382.     .8080                ;set m80 for 8080 code
  383.  
  384. .ver    set 3                ;version number n.n
  385. .mon    set 11                ;version date parameters
  386. .day    set 30
  387. .year    set 86
  388.  
  389. asize    equ    16            ;ascii buffer size
  390.  
  391.     .comment        #
  392.  
  393. px-8 programmers calculator, (c) 1986 evd
  394.  
  395. ops:    + add, - sub, * mul, / div, % mod, & and, | or, ^ xor
  396. stk:    > roll up, < roll dwn, = swap xy, ^X clr stk, BS edit/clrx, CR enter
  397. base:    \B binary, \D dec, \H hex, \O octal 
  398.  
  399. vers:    0.1 11/01/86    initial version
  400.     0.2 11/04/86    fixed leadin bug
  401.     0.3 11/30/86    mods for time/date disp w/rtx
  402.  
  403.                 #
  404.  
  405.     .xlist
  406.  
  407. ver_pr    macro m,d,y,v
  408.     .printx * version nmbr:  v/10  *
  409.     .printx * version date:  m-d-y *
  410.     endm
  411.  
  412.     if1
  413.      .printx **
  414.      .printx * PrgCal, RTX version *
  415.      .printx **
  416.      ver_pr %.mon,%.day,%.year,%.ver
  417.      .printx **
  418.     endif
  419.  
  420. ;
  421. ; some macros for z80
  422.  
  423. ; m68 style relative ops
  424.  
  425. bra    macro lblnam            ;branch always (jr)
  426.     .z80
  427.     jr lblnam
  428.     .8080
  429.     endm
  430.  
  431. bcc    macro lblnam            ;branch carry clr (jr nc)
  432.     .z80
  433.     jr nc,lblnam
  434.     .8080
  435.     endm
  436.  
  437. bcs    macro lblnam            ;branch carry set (jr c)
  438.     .z80
  439.     jr c,lblnam
  440.     .8080
  441.     endm
  442.  
  443. bne    macro lblnam            ;branch not equal (jr nz)
  444.     .z80
  445.     jr nz,lblnam
  446.     .8080
  447.     endm
  448.  
  449. beq    macro lblnam            ;branch equal (jr z)
  450.     .z80
  451.     jr z,lblnam
  452.     .8080
  453.     endm
  454.  
  455. bge    macro lblnam            ;branch greater or equal, c=clr
  456.     bcc lblnam
  457.     endm
  458.  
  459. bls    macro lblnam            ;branch less, c=set
  460.     bcs lblnam
  461.     endm
  462.  
  463. dbnz    macro lblnam            ;b=b-1, branch b <> 0
  464.     .z80
  465.     djnz lblnam
  466.     .8080
  467.     endm
  468.  
  469.  
  470. ; bit test & set ops
  471.  
  472. bit.m    macro bitno            ;test bitno @(hl)
  473.     .z80
  474.     bit bitno,(hl)
  475.     .8080
  476.     endm
  477.  
  478. set.m    macro bitno            ;set bitno @(hl)
  479.     .z80
  480.     set bitno,(hl)
  481.     .8080
  482.     endm
  483.  
  484.  
  485. ; misc ops
  486.  
  487. ld.    macro param1,param2        ;generalized z80 load op
  488.     .z80
  489.     ld param1,param2
  490.     .8080
  491.     endm
  492.  
  493.  
  494. lsr    macro reg            ;0 -> (reg) -> carry
  495.     .z80
  496.     srl reg
  497.     .8080
  498.     endm
  499.  
  500. ror    macro reg            ;same as 'rar' for any reg
  501.     .z80
  502.     rr reg
  503.     .8080
  504.     endm
  505.  
  506. rol    macro reg            ;same as 'ral' for any reg
  507.     .z80
  508.     rl reg
  509.     .8080
  510.     endm
  511.  
  512.  
  513. dsub    macro regpr            ;hl=hl-(reg pair)-carry
  514.     ora a                ;clear carry
  515.     .z80
  516.     sbc hl,regpr
  517.     .8080
  518.     endm
  519.  
  520.     .list
  521.     page
  522.  
  523. ;
  524. ; sign on
  525.  
  526. pcal:    lxi h,signon
  527.     call stout1            ;sign on
  528.     call hdline
  529.     call dspstk            ;display stack & enter command loop
  530.  
  531.  
  532. ;
  533. ; command loop, radix lead-in & op-code routines 
  534.  
  535. cmdlop:    lxi h,cmdlop
  536.     push h                ;preset return addr
  537.     lxi h,inpos
  538.     call stout1            ;set cursor for input
  539.     call getkey            ;get input
  540.     jz pcalq            ;power down exit
  541.     cpi esc
  542.     jz pcalx            ;exit
  543.     cpi '>'
  544.     jz rup                ;roll up
  545.     cpi '<'
  546.     jz rdwn                ;roll down
  547.     cpi '='
  548.     jz swapxy            ;exchg x & y
  549.     cpi cr
  550.     jz entx                ;enter
  551.     cpi '\'
  552.     jz leadin            ;radix lead-in
  553.  
  554.     lxi h,oprtn-1            ;chk for op-codes
  555.     mvi b,oprtn-opchr        ;length
  556. clop:    cmp m
  557.     jz ops                ;match, do it
  558.     dcx h
  559.     dbnz clop            ;else cont
  560.  
  561.     cpi 'X'-64
  562.     jz stkclr            ;^X to clear stack
  563.     cpi bs
  564.     jz bkspc            ;backspace to del entry digit
  565.  
  566.     cpi 'a'
  567.     bls isupr            ;upper case or dgt now
  568.     ani 05fh            ;make lower upper
  569. isupr:    mov b,a                ;save ascii
  570.     cpi '0'
  571.     rc                ;too small
  572.     cpi ':'
  573.     bls dgtin            ;ok, is 0 - 9
  574.     cpi 'A'                ;chk A-F
  575.     rc                ;no
  576.     cpi 'F'+1
  577.     rnc                ;no
  578.     sui 7                ;ok, adj
  579. dgtin:    ani 0fh                ;strip ascii
  580.     lhld radix            ;get radix
  581.     cmp l                ;test
  582.     rnc                ;too big
  583.  
  584.     mov c,a                ;dgt ok: (b)=ascii, (c)= binary
  585.     push b                ;save
  586.     lxi h,sflag            ;get flag addr
  587.     bit.m 0                ;1=entry in progress now
  588.     bne dgi1            ;cont entry
  589.     set.m 0                ;mark entry now
  590.     bit.m 1                ;1=lift, 0=overwrite
  591.     beq dgi0            ;ovrwrt
  592.     call rollup            ;lift
  593.     call dspstk            ;and display
  594. dgi0:    call xclr            ;get rid of old data
  595. dgi1:    pop b                ;restore
  596.     lda sizex
  597.     ora a                ;test regx size
  598.     rz                ;full
  599.     cpi asize
  600.     beq dgi2            ;empty, skip shift
  601.     push b                ;save data
  602.     lxi b,asize-1            ;set count
  603.     lxi d,regxa+2            ;set destination
  604.     lxi h,regxa+3            ;set source
  605.     .z80
  606.     ldir                ;shift ascii left
  607.     .8080
  608.     pop b                ;restore
  609. dgi2:    lxi h,regxb-1            ;set at lsd of ascii
  610.     mov m,b                ;put in new dgt
  611.     mvi b,0                ;extend dgt (c)
  612.     push b                ;save input data
  613.     ld. bc,(regxb)            ;get current reg value
  614.     ld. de,(radix)            ;get radix
  615.     call .mul            ;bc= bc*de
  616.     pop d                ;restore input data
  617.     call .add            ;add in: bc= bc+de
  618.     ld. (regxb),bc            ;save
  619.     lxi h,sizex
  620.     dcr m                ;adj size
  621.     jmp dspx            ;display & return
  622.  
  623. bkspc:    lda sizex
  624.     cpi asize            ;empty?
  625.     jz xclr                ;yes, clear x & return
  626.  
  627.     mvi a,' '            ;preset
  628.     mvi b,asize            ;set count
  629.     lxi h,regxa+2            ;set pointer
  630. bks0:    mov c,m                ;get current char
  631.     mov m,a                ;set new
  632.     mov a,c                ;keep
  633.     inx h                ;next
  634.     dbnz bks0            ;loop
  635.  
  636.     cpi ':'                ;done: (a) is del char, (hl)= regxb
  637.     bls bks1            ;is 0-9
  638.     sui 7                ;else adj
  639. bks1:    ani 0fh                ;strip ascii
  640.     mov e,a
  641.     mvi d,0                ;de= del dgt
  642.     ld. bc,(regxb)            ;get current
  643.     call .sub            ;remove digit (bc= bc-de)
  644.     ld. de,(radix)
  645.     call .div            ;adj
  646.     ld. (regxb),bc            ;new val
  647.     lxi h,sizex
  648.     inr m                ;adj for bs
  649.     jmp dspx            ;disp x & return
  650.  
  651.  
  652. leadin:    
  653.     lxi h,inpos            ;(v0.3)
  654.     call stout1            ;(v0.3) establish position
  655.     mvi a,'\'            ;(v0.3)
  656.     call chrout            ;echo '\'
  657.     call ldi            ;process next input (no rtn: not BDHO)
  658.     shld rmadr            ;set radix msg addr
  659.     sta radix            ;set radix
  660.     jmp drpx            ;then disp stack & return
  661.  
  662. ldi:    call getkey            ;get char
  663.     jz pcalq            ;special exit
  664. ;(v0.3)    call chrout            ;echo input
  665.     ani 05fh            ;assure upper case
  666.     cpi 'B'
  667.     beq isbin            ;binary
  668.     cpi 'D'
  669.     beq isdec            ;decimal
  670.     cpi 'H'
  671.     beq ishex            ;hex
  672.     cpi 'O'
  673.     beq isoct            ;oct
  674.     pop h                ;else clear last call
  675.     ret                ;and rtn to cmd loop
  676.  
  677. isoct:    mvi a,8                ;radix
  678.     lxi h,octmsg            ;radix message
  679.     ret
  680. isbin:    mvi a,2
  681.     lxi h,binmsg
  682.     ret
  683. isdec:    mvi a,10
  684.     lxi h,decmsg
  685.     ret
  686. ishex:    mvi a,16
  687.     lxi h,hexmsg
  688.     ret
  689.  
  690.  
  691. ops:    dcr b                ;adj position count
  692.     mov a,b
  693.     rlc                ;*2
  694.     mov c,a
  695.     mvi b,0                ;bc= routine position
  696.     lxi h,oprtn            ;base addr
  697.     dad b
  698.     mov a,m                ;routine addr low
  699.     inx h
  700.     mov h,m                ;high
  701.     mov l,a
  702.     shld opcode            ;install addr in routine
  703.  
  704.     ld« bc,(regyb⌐            ;ge⌠ data
  705.     ld. de,(regxb)
  706.     call 0                ;modified adde
  707. opcode    equ $-2
  708.     ld. (regyb),bc            ;setup result
  709.     jmp drop            ;exit w/stk drop
  710.  
  711.  
  712. pcalx:    pop h                ;clear stack
  713.     jmp restrt            ;and exit
  714. pcalq:    pop h
  715.     jmp exit            ;exit after power off
  716.  
  717.  
  718. ;
  719. ; stack routines
  720.  
  721. xclr:    call clrx            ;clear reg x
  722.     mvi a,1
  723.     sta sflag            ;mark entry in progress & overwrite
  724.     jmp dspx            ;disp & rtn
  725.  
  726. stkclr:    call clrstk            ;clear stk & disp
  727.     bra entx1
  728.  
  729. entx:    call rollup            ;roll up stack
  730.     ld. (regxb),de            ;overwrite x
  731. entx1:    xra a
  732.     bra drpx1
  733.  
  734. drop:    call rolldn            ;roll down stack
  735.     ld. (regtb),de            ;overwrite t
  736. drpx:    mvi a,2
  737. drpx1:    sta sflag            ;mark new entry & lift
  738.     mvi a,asize
  739.     sta sizex            ;reset ascii length
  740. drpx2:    jmp dspstk            ;disp & rtn
  741.  
  742. rup:    call rollup
  743.     bra drpx
  744.  
  745. rdwn:    call rolldn
  746.     bra drpx
  747.  
  748. swapxy:    lhld regxb            ;swap x & y
  749.     ld. de,(regyb)
  750.     shld regyb
  751.     ld. (regxb),de
  752.     bra drpx
  753.  
  754.  
  755. rollup:    ld. de,(regxb)            ;get regx
  756.     lhld regtb
  757.     shld regxb            ;t -> x
  758.     lhld regzb
  759.     shld regtb            ;z -> t
  760.     lhld regyb
  761.     shld regzb            ;y -> z
  762.     ld. (regyb),de            ;x -> y
  763.     ret
  764.  
  765. rolldn:    ld. de,(regtb)            ;get regt
  766.     lhld regxb
  767.     shld regtb            ;x -> t
  768.     lhld regyb
  769.     shld regxb            ;y -> x
  770.     lhld regzb
  771.     shld regyb            ;z -> y
  772.     ld. (regzb),de            ;t -> z
  773.     ret
  774.  
  775.  
  776. ;
  777. ; arithmetic & logical routines
  778.  
  779. .add:    ;bc+de=bc, bc=de & other regs unchanged
  780.  
  781.     xchg
  782.     dad b
  783.     push h
  784.     pop b
  785.     xchg
  786.     ret
  787.  
  788.  
  789. .sub:    ;bc-de=bc, other regs unchanged
  790.  
  791.     push h
  792.     push b
  793.     pop h
  794.     dsub de                ;z80: hl=hl-(reg pair)-carry
  795.     push h
  796.     pop b
  797.     pop h
  798.     ret
  799.  
  800.  
  801. .mul:    ;bc*de = bc w/de as 16 bit overflow, (a) used & hl unchanged
  802.  
  803.     push h                ;save hl
  804.     mvi a,16            ;bit count
  805.     lxi h,0                ;clear ovrflo
  806.     push h                ;and result
  807. mu1:    lsr d                ;shift multiplier right
  808.     ror e
  809.     bcc mu2                ;ls bit is 0
  810.     dad b                ;else adj bc
  811. mu2:    ror h                ;shift 32 bit answer, ovrflo first
  812.     ror l
  813.     xthl
  814.     ror h                ;then result
  815.     ror l
  816.     xthl
  817.     dcr a                ;chk bit count
  818.     bne mu1
  819.     xchg                ;done, de=overflow (ms 16 bits)
  820.     pop b                ;bc=result (ls 16 bits)
  821.     pop h                ;restore hl
  822.     ret
  823.  
  824.  
  825. .div:    ;bc/de = bc w/de as remainder, (a) used & hl unchanged
  826.  
  827.     push h
  828.     lxi h,0                ;2s comp of de (0-de)
  829.     dsub de                ;z80: hl=hl-(reg pair)-carry
  830.     xchg
  831.  
  832.     lxi h,0                ;initial remainder
  833.     mvi a,17            ;init bit count
  834. dv0:    push h                ;save remainder
  835.     dad d                ;subtract divisor (2s comp add)
  836.     bcc dv1                ;under-flow
  837.     xthl                ;else exchange hl with (sp)
  838. dv1:    pop h                ;restore remainder
  839.     push psw            ;save bit count
  840.     rol c                ;rotate left bc & hl
  841.     rol b
  842.     rol l
  843.     rol h
  844.     pop psw                ;restore bit count and adj
  845.     dcr a
  846.     bne dv0                ;cont til zero
  847.  
  848.     ora a                ;then clr carry
  849.     ror h                ;and adjust remainder
  850.     ror l
  851.     xchg                ;put remainder in de
  852.     pop h
  853.     ret                ;quotient in bc
  854.  
  855.  
  856. .mod:    ; bc mod de = de
  857.  
  858.     call .div            ;do div
  859.     mov b,d                ;set remanider as result
  860.     mov c,e
  861.     ret
  862.  
  863.  
  864. .and:    ; bc&de=bc, only bc and (a) changed
  865.  
  866.     mov a,c
  867.     ana e
  868.     mov c,a
  869.     mov a,b
  870.     ana d
  871.     mov b,a
  872.     ret
  873.  
  874.  
  875. .or:    ; bc|de=bc, only bc and (a) changed
  876.  
  877.     mov a,c
  878.     ora e
  879.     mov c,a
  880.     mov a,b
  881.     ora d
  882.     mov b,a
  883.     ret
  884.  
  885.  
  886. .xor:    ; bc^de=bc, only bc and (a) changed
  887.  
  888.     mov a,c
  889.     xra e
  890.     mov c,a
  891.     mov a,b
  892.     xra d
  893.     mov b,a
  894.     ret
  895.  
  896.  
  897. ;
  898. ; radix conversion routine
  899.  
  900. radvrt:    push h                ;save index (at msd of ascii buffer)
  901.     call clrg0            ;clear reg
  902.     push h                ;save index (at lsd of ascii buffer)
  903.     inx h
  904.     mov c,m
  905.     inx h
  906.     mov b,m                ;(bc)= reg data
  907.     lhld radix
  908.     xchg                ;(de)= radix
  909.     pop h                ;restore buffer index
  910. rdv0:    push d                ;save radix divisor
  911.     call .div            ;bc= bc/de, de is remainder
  912.     mov a,e                ;(a) is remainder
  913.     pop d                ;restore radix
  914.     ori '0'                ;rem to ascii
  915.     cpi ':'
  916.     bls rdv1            ;is 0-9
  917.     adi 7                ;is A or more
  918. rdv1:    mov m,a                ;char to buffer
  919.     dcx h                ;adj
  920.     mov a,b
  921.     ora c                ;complete?
  922.     bne rdv0            ;no, loop
  923.     pop h                ;yes, restore msd index
  924.     ret
  925.  
  926.  
  927. ;
  928. ; stack clear & display routines
  929.  
  930. clrstk:    lxi h,regtb            ;set at binary reg
  931.     call clreg            ;and clear reg
  932.     lxi h,regzb
  933.     call clreg
  934.     lxi h,regyb
  935.     call clreg
  936. clrx:    lxi h,regxb            ;x reg entry, fall thru
  937.  
  938. clreg:    xra a                ;clear (a)
  939.     mov m,a
  940.     inx h
  941.     mov m,a                ;clear binary part of reg
  942.     lxi b,-(asize+1)
  943.     dad b                ;set (hl) to ascii part
  944. clrg0:    mvi b,asize-1            ;set count
  945. clrg1:    mvi m,' '            ;clear ascii
  946.     inx h
  947.     dbnz clrg1
  948.     mvi m,'0'            ;last is 0
  949.     ret                ;rtn (hl)= lsd of buffer
  950.  
  951. dspstk:    lhld rmadr            ;get addr of radix message
  952.     call stout1            ;print it
  953.     lxi h,regta            ;index at ascii reg
  954.     call dspreg            ;display reg
  955.     lxi h,regza
  956.     call dspreg
  957. dspyx:    lxi h,regya            ;disp x & y entry
  958.     call dspreg
  959. dspx:    lxi h,regxa            ;disp x entry
  960.  
  961. dspreg:    mvi a,esc
  962.     call chrout            ;esc out
  963.     mvi a,'='
  964.     call chrout            ;lead for cursor addr
  965.     mvi b,2                ;set count
  966.     call dspr1            ;2 chars @(hl) out
  967.  
  968.     mvi a,esc
  969.     call chrout
  970.     mvi a,'T'
  971.     call chrout            ;clear to end of line
  972.  
  973.     call radvrt            ;convert reg?b to reg?a
  974.  
  975.     mvi b,16
  976. dspr1:    mov a,m                ;char @ reg?a
  977.     call chrout            ;out
  978.     inx h
  979.     dbnz dspr1
  980.     ret
  981.  
  982.  
  983. ;
  984. ; data area
  985.  
  986. sizex:    db asize            ;ascii in reg x
  987. sflag:    db 2                ;  bit 0      bit 1
  988.                     ;0=new entry    0=no lift
  989.  
  990. radix:    dw 10                ;display radix
  991. rmadr:    dw decmsg            ;radix message addr
  992.  
  993. opchr:    db '+-*/%^|&'
  994. oprtn:    dw .add,.sub,.mul,.div
  995.     dw .mod,.xor,.or,.and
  996.  
  997. signon:    db cls,'*** PrgCal ',(.ver/10+'0'),'.',(.ver mod 10+'0'),' ***',term
  998.  
  999. binmsg:    db esc,'=',0+32,22+32,'Bin',term
  1000. octmsg:    db esc,'=',0+32,22+32,'Oct',term
  1001. decmsg:    db esc,'=',0+32,22+32,'Dec',term
  1002. hexmsg:    db esc,'=',0+32,22+32,'Hex',term
  1003.  
  1004. inpos:    db esc,'=',6+32,32+32,esc,'T',term
  1005.  
  1006. regxa:    db 6+32,14+32,'               0'
  1007. regxb:    dw 0                ;row,col,ascii,binary
  1008.  
  1009. regya:    db 5+32,14+32,'               0'
  1010. regyb:    dw 0                ;row,col,ascii,binary
  1011.  
  1012. regza:    db 4+32,14+32,'               0'
  1013. regzb:    dw 0                ;row,col,ascii,binary
  1014.  
  1015. regta:    db 3+32,14+32,'               0'
  1016. regtb:    dw 0                ;row,col,ascii,binary
  1017.  
  1018.     .z80            ;back to epson code
  1019.  
  1020. ;
  1021. ;------------------------------------------------------------------------------
  1022. ;
  1023.     .xlist
  1024.     if1
  1025.      .printx **
  1026.      .printx * RTX RS-232 Setup *
  1027.      .printx **
  1028.     endif
  1029.     .list
  1030.     subttl    RS-232 display/setup module
  1031.     page
  1032. ;
  1033. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1034. ;
  1035. bitrate        equ    0F6A9H
  1036. wl        equ    bitrate+1
  1037. parity        equ    wl+1
  1038. stopbits    equ    parity+1
  1039. special        equ    stopbits+1
  1040. drsdat        equ    0F00FH
  1041. ;
  1042. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1043. ;
  1044. rs232:    ld    hl,rsmsg
  1045.     call    stout1
  1046.     call    hdline
  1047. ;
  1048. displ:    ld    hl,csrbr    ;Position cursor
  1049.     call    stout1
  1050.     ld    a,(bitrate)    ;Get baud rate
  1051.     bit    7,a        ;Convert the baud rate to a simple value 0-?
  1052.     jr    z,rs10
  1053.     sub    070H
  1054. rs10:    cp    13
  1055.     jr    c,rs11
  1056.     sub    6
  1057.     jr    rs12
  1058. rs11:    rra
  1059.     and    07FH
  1060. rs12:    sub    1
  1061.     rlca
  1062.     rlca
  1063.     rlca
  1064.     ld    l,a
  1065.     ld    h,0
  1066.     ld    de,bittbl    ;Display baud rate string
  1067.     add    hl,de
  1068.     call    stout1
  1069. ;
  1070.     ld    hl,csrwl    ;Repeat procedure for word length
  1071.     call    stout1
  1072.     ld    a,(wl)
  1073.     add    a,035H
  1074.     call    chrout
  1075. ;
  1076.     ld    hl,csrpar    ;And parity
  1077.     call    stout1
  1078.     ld    a,(parity)
  1079.     ld    hl,partbl
  1080.     ld    de,5
  1081.     or    a
  1082.     jr    z,rs20
  1083.     add    hl,de
  1084.     dec    a
  1085.     jr    z,rs20
  1086.     add    hl,de
  1087. rs20:    call    stout1
  1088. ;
  1089.     ld    hl,csrstp    ;And stopbits
  1090.     call    stout1
  1091.     ld    a,(stopbits)
  1092.     bit    1,a
  1093.     jr    z,rs30
  1094.     dec    a
  1095. rs30:    add    a,030H
  1096.     call    chrout
  1097. ;
  1098.     ld    hl,csrxon    ;And Xon/Xoff flag
  1099.     call    stout1
  1100.     ld    hl,yntbl
  1101.     ld    a,(special)
  1102.     bit    4,a
  1103.     jr    z,rs40
  1104.     ld    de,4
  1105.     add    hl,de
  1106. rs40:    call    stout1
  1107. ;
  1108.     ld    hl,csrdft    ;And set-defaults flag
  1109.     call    stout1
  1110.     ld    a,(rstdft)
  1111.     ld    hl,yntbl
  1112.     or    a
  1113.     jr    nz,rs50
  1114.     ld    de,4
  1115.     add    hl,de
  1116. rs50:    call    stout1
  1117. ;
  1118. rs60:    call    getkey        ;Get user's choice and validate
  1119.     jp    z,exit
  1120.     cp    esc
  1121.     jr    z,rsend
  1122.     cp    '1'
  1123.     jr    c,rs60
  1124.     cp    ':'
  1125.     jr    c,rs70
  1126.     res    5,a
  1127.     cp    'A'
  1128.     jr    c,rs60
  1129.     cp    'N'
  1130.     jr    nc,rs60
  1131.     sub    7
  1132. ;
  1133. rs70:    sub    030H
  1134. ;
  1135.     ld    hl,dattbl-1    ;Get top of data table into HL
  1136.     ld    d,0
  1137.     ld    e,a
  1138.     add    hl,de        ;Add offset calculated from user's entry
  1139.     ld    b,(hl)        ;Get the value to store into B
  1140.  
  1141.     ld    hl,bitrate    ;Depending on the keystroke entered,
  1142.     cp    12        ;store the value into the appropriate
  1143.     jr    c,rs80        ;memory area (RS-232 work or set-default
  1144.     inc    hl        ;flag)
  1145.     cp    14
  1146.     jr    c,rs80
  1147.     inc    hl
  1148.     cp    17
  1149.     jr    c,rs80
  1150.     inc    hl
  1151.     cp    19
  1152.     jr    c,rs80
  1153.     inc    hl
  1154.     cp    21
  1155.     jr    c,rs80
  1156.     ld    hl,rstdft
  1157. ;
  1158. rs80:    ld    (hl),b
  1159.     jp    displ        ;Go round again - redisplay settings
  1160. ;
  1161. rsend:    ld    a,(rstdft)    ;Check reset-defaults flag
  1162.     or    a
  1163.     jp    z,restrt
  1164.     ld    bc,5        ;Copy working params to default params
  1165.     ld    de,drsdat
  1166.     ld    hl,bitrate
  1167.     ldir
  1168.     jp    restrt
  1169. ;
  1170. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1171. ;
  1172. rsmsg:
  1173.     cls,'*** RS-232C Setup ***'
  1174.     esc,'=',2+32,0+32,'bits/second    :'
  1175.     esc,'=',3+32,0+32,'data bits      :'
  1176.     esc,'=',4+32,0+32,'parity check   :'
  1177.     esc,'=',5+32,0+32,'stop bits      :'
  1178.     esc,'=',6+32,0+32,'Xon/Xoff       :'
  1179.     esc,'=',7+32,0+32,'reset defaults :'
  1180.     esc,'=',2+32,26+32,'1=19200  2=9600  3=4800  5=1200  7=300  A=75/1200'
  1181.     esc,'=',3+32,26+32,'C=7      D=8'
  1182.     esc,'=',4+32,26+32,'E=none   F=odd   G=even'
  1183.     esc,'=',5+32,26+32,'H=1      I=2'
  1184.     esc,'=',6+32,26+32,'J=yes    K=no'
  1185.     esc,'=',7+32,26+32,'L=yes    M=no',term
  1186. ;
  1187. csrbr:    esc,'=',2+32,17+32,term
  1188. csrwl:    esc,'=',3+32,17+32,term
  1189. csrpar:    esc,'=',4+32,17+32,term
  1190. csrstp:    esc,'=',5+32,17+32,term
  1191. csrxon:    esc,'=',6+32,17+32,term
  1192. csrdft:    esc,'=',7+32,17+32,term
  1193. ;
  1194. bittbl:    '110    ',term
  1195.     '150    ',term
  1196.     '300    ',term
  1197.     '600    ',term
  1198.     '1200   ',term
  1199.     '2400   ',term
  1200.     '4800   ',term
  1201.     '9600   ',term
  1202.     '19200  ',term
  1203.     '1200/75',term
  1204.     '75/1200',term
  1205. ;
  1206. partbl:    'none',term
  1207.     'odd ',term
  1208.     'even',term
  1209. ;
  1210. yntbl:    'yes',term
  1211.     'no ',term
  1212. ;
  1213. dattbl:    15,14,13,12,10,8,6,4,2,129,128,2,3,0,1,3,1,3,239,255,255,0
  1214. ;
  1215. ;------------------------------------------------------------------------------
  1216. ;
  1217.     .xlist
  1218.     if1
  1219.      .printx **
  1220.      .printx * RTX RAM Editor *
  1221.      .printx **
  1222.     endif
  1223.     .list
  1224.     subttl    RAM editor module
  1225.     page
  1226. ;
  1227. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1228. ;
  1229. iselbnk        equ    0ED29H
  1230. ldaxx        equ    0ECF9H
  1231. staxx        equ    0ECFFH
  1232. ;
  1233. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1234. ;
  1235. ramed:    ld    hl,redmsg    ;Menu
  1236.     call    stout1
  1237.     call    hdline
  1238.     call    crlf
  1239.     xor    a
  1240.     ld    (tdup),a    ;disable time/date updates
  1241.     ld    hl,00100H    ;Initial address for dump/set = 0100
  1242.     ld    (curradr),hl
  1243. ;
  1244. rmed10:    ld    a,'-'        ;Prompt
  1245.     call    chrout
  1246. rmed20:    call    getkey        ;Key in and validate
  1247.     jp    z,exit
  1248.     cp    esc
  1249.     jp    z,restrt
  1250.     res    5,a        ;Upper case
  1251.     cp    'S'
  1252.     jp    z,setmem    ;S for set
  1253.     cp    'D'
  1254.     jr    nz,rmed20
  1255. ;
  1256. dmpmem:    call    chrout        ;D for dump. Echo to screen
  1257.     ld    b,4        ;Get 4 hex digits - they're stored in (curradr)
  1258.     call    gethex
  1259.     jp    z,abort        ;If gethex returns Z set, ESC was pressed
  1260. ;
  1261.     ld    c,0        ;Select RAM bank
  1262.     di            ;Peace and quiet required for this
  1263.     call    iselbnk
  1264.     push    bc
  1265.     ld    bc,112        ;Read 112 bytes from bank 0
  1266.     ld    de,rambuf
  1267.     ld    hl,(curradr)
  1268.     ldir
  1269.     pop    bc
  1270.     call    iselbnk        ;Put back old bank
  1271.     ei            ;Open the door to the outside world again
  1272. ;
  1273.     ld    hl,rambuf    ;Set up some pointers & counters
  1274.     ld    b,7        ;7 rows of 16 bytes
  1275. ;
  1276. dmp10:    push    bc
  1277. ;
  1278.     ld    a,(curradr+1)    ;Output address of this row in ascii hex
  1279.     call    binhex
  1280.     ld    a,(curradr)
  1281.     call    binhex
  1282.     ld    a,':'
  1283.     call    chrout
  1284.     ld    a,' '
  1285.     call    chrout
  1286. ;
  1287.     ld    b,16        ;16 bytes
  1288.     push    hl
  1289. ;
  1290. dmp20:    ld    a,(hl)        ;Output each as ascii hex
  1291.     call    binhex
  1292.     ld    a,' '        ;Separate with spaces
  1293.     call    chrout
  1294.     inc    hl
  1295.     djnz    dmp20
  1296. ;
  1297.     ld    a,' '        ;output a couple of spaces
  1298.     call    chrout
  1299.     call    chrout
  1300. ;
  1301.     ld    b,16        ;16 bytes again, this time in true ascii
  1302.     pop    hl
  1303. ;
  1304. dmp30:    ld    a,(hl)
  1305.     cp    020H        ;If less than 32 then output a dot
  1306.     jr    nc,dmp50
  1307. dmp40:    ld    a,'.'
  1308. dmp50:    cp    0A0H        ;If not less than 160 then output a dot
  1309.     jr    nc,dmp40
  1310.     call    chrout
  1311.     inc    hl
  1312.     djnz    dmp30
  1313. ;
  1314.     ld    a,cr        ;End line with CRLF
  1315.     call    chrout
  1316.     ld    a,lf
  1317.     call    chrout
  1318. ;
  1319.     push    hl
  1320.     ld    hl,(curradr)
  1321.     ld    de,16
  1322.     add    hl,de        ;Increment current address
  1323.     ld    (curradr),hl
  1324.     pop    hl
  1325. ;
  1326.     pop    bc
  1327.     djnz    dmp10        ;Repeat for next row
  1328. ;
  1329.     jp    rmed10        ;Restart
  1330. ;
  1331. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1332. ;
  1333. setmem:    call    chrout        ;Echo the "S"
  1334.     ld    b,4        ;Get address
  1335.     call    gethex
  1336.     jp    z,abort
  1337. ;
  1338. set10:    ld    a,(curradr+1)    ;Output address
  1339.     call    binhex
  1340.     ld    a,(curradr)
  1341.     call    binhex
  1342.     ld    a,':'
  1343.     call    chrout
  1344.     ld    a,' '
  1345.     call    chrout
  1346. ;
  1347.     ld    hl,(curradr)    ;Output current contents
  1348.     ld    c,0
  1349.     call    ldaxx
  1350.     ld    (currbyt),a    ;Store in current byte
  1351.     call    binhex
  1352.     ld    a,' '
  1353.     call    chrout
  1354.     ld    b,2        ;Get new byte
  1355.     call    gethex
  1356.     jp    z,abort
  1357.     ld    a,(currbyt)    ;Store new byte in current address
  1358.     ld    hl,(curradr)
  1359.     ld    c,0
  1360.     call    staxx
  1361.     inc    hl        ;Increment address
  1362.     ld    (curradr),hl
  1363.     jr    set10        ;Go round again
  1364. ;
  1365. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1366. ;
  1367. abort:    ld    a,cr        ;ESC pressed. Output CRLF
  1368.     call    chrout
  1369.     ld    a,lf
  1370.     call    chrout
  1371.     jp    rmed10        ;and restart
  1372. ;
  1373. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1374. ;
  1375. gethex:    ld    hl,hexwork    ;This subroutine reads hex characters from the
  1376.     ld    c,0        ;keyboard (0-9, A-F). If CR is pressed straight
  1377. ;                ;away it returns with (currbyt) and (curradr)
  1378. hex10:    push    bc        ;unchanged and Z=0. If ESC is pressed it
  1379.     push    hl        ;returns immediately with Z=1. If hex digits
  1380.     call    getkey        ;are entered it will not allow RETURN until the
  1381.     pop    hl        ;correct number have been entered (2 or 4). If
  1382.     pop    bc        ;2 are entered they go in (currbyt), if 4 they
  1383.     cp    esc        ;go in (curradr). BS is allowable.
  1384.     ret    z
  1385.     cp    bs
  1386.     jr    z,backsp
  1387.     cp    cr
  1388.     jr    z,return
  1389.     ld    d,a
  1390.     ld    a,c
  1391.     cp    b
  1392.     jr    nc,hex10
  1393.     ld    a,d
  1394.     cp    '0'
  1395.     jr    c,hex10
  1396.     cp    ':'
  1397.     jp    c,hex20
  1398.     and    11011111B
  1399.     cp    'A'
  1400.     jr    c,hex10
  1401.     cp    'G'
  1402.     jr    nc,hex10
  1403. hex20:    call    chrout
  1404.     sub    030H
  1405.     cp    10
  1406.     jr    c,hex30
  1407.     sub    7
  1408. hex30:    ld    (hl),a
  1409.     inc    c
  1410.     inc    hl
  1411.     jr    hex10
  1412. ;
  1413. backsp:    ld    a,c
  1414.     or    a
  1415.     jr    z,hex10
  1416.     ld    a,bs
  1417.     call    chrout
  1418.     ld    a,deleol
  1419.     call    chrout
  1420.     dec    c
  1421.     dec    hl
  1422.     jr    hex10
  1423. ;
  1424. return:    ld    a,c
  1425.     or    a
  1426.     jr    z,hex40
  1427.     cp    b
  1428.     jr    nz,hex10
  1429.     ld    a,(hexwork)
  1430.     rlca
  1431.     rlca
  1432.     rlca
  1433.     rlca
  1434.     ld    d,a
  1435.     ld    a,(hexwork+1)
  1436.     add    a,d
  1437.     ld    (currbyt),a
  1438.     ld    c,a
  1439.     ld    a,b
  1440.     cp    2
  1441.     jr    z,hex40
  1442.     ld    a,c
  1443.     ld    (curradr+1),a
  1444.     ld    a,(hexwork+2)
  1445.     rlca
  1446.     rlca
  1447.     rlca
  1448.     rlca
  1449.     ld    d,a
  1450.     ld    a,(hexwork+3)
  1451.     add    a,d
  1452.     ld    (curradr),a
  1453. hex40:    ld    a,cr
  1454.     call    chrout
  1455.     ld    a,lf
  1456.     call    chrout
  1457.     xor    a
  1458.     dec    a
  1459.     ret
  1460. ;
  1461. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1462. ;
  1463. binhex:    ld    c,a        ;This routine outputs a character as two ASCII
  1464.     and    11110000B    ;hex characters
  1465.     rrca
  1466.     rrca
  1467.     rrca
  1468.     rrca
  1469.     call    bh10
  1470.     ld    a,c
  1471.     and    00001111B
  1472. bh10:    cp    10
  1473.     jr    c,bh20
  1474.     add    a,7
  1475. bh20:    add    a,030H
  1476.     jp    chrout
  1477. ;
  1478. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1479. ;
  1480. redmsg:
  1481.     cls,'*** RAM Editor ***',esc,'3',term
  1482. ;
  1483. ;------------------------------------------------------------------------------
  1484. ;
  1485.     .xlist
  1486.     if1
  1487.      .printx **
  1488.      .printx * RTX Terminal *
  1489.      .printx **
  1490.     endif
  1491.     .list
  1492.     subttl    Terminal emulation module
  1493.     page
  1494. ;
  1495. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1496. ;
  1497. combuf        equ    0FB90H
  1498. comlen        equ    00186H
  1499. rsflg        equ    0F6B8H
  1500. rsdat        equ    0F6A9H
  1501. yshfdt        equ    0F0FEH
  1502. ;
  1503. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1504. ;
  1505. terminal:
  1506.     ld    hl,tmsg1    ;Output header
  1507.     call    stout1
  1508.     call    hdline
  1509.     xor    a
  1510.     ld    (tdup),a    ;disable time/date updates
  1511. ;
  1512.     ld    a,(rsflg)    ;Serial being used?
  1513.     bit    0,a
  1514.     jr    z,term20    ;No
  1515. ;
  1516.     ld    hl,tmsg2    ;Error messgae
  1517.     call    stout1
  1518. ;
  1519. term10:    call    getkey        ;Wait for ESC
  1520.     jp    z,exit
  1521.     cp    esc
  1522.     jr    nz,term10
  1523.     jp    restrt        ;And return to main menu
  1524. ;
  1525. term20:    ld    hl,tmsg3    ;Cursor on etc.
  1526.     call    stout1
  1527.  
  1528.     xor    a
  1529.     ld    (local),a    ;disable local
  1530.     call    getkey        ;get ans
  1531.     jp    z,exit
  1532.     cp    esc
  1533.     jp    z,restrt
  1534.     res    5,a        ;make upper
  1535.     cp    'Y'
  1536.     jr    nz,term21    ;assume half duplex
  1537.     ld    (local),a    ;else set local
  1538. term21:    ld    a,cls
  1539.     call    chrout        ;clear screen to start
  1540.  
  1541.     ld    hl,combuf    ;Set up buffer address
  1542.     ld    (tdata),hl
  1543.     ld    hl,comlen    ;Length of COMBUF
  1544.     ld    (tdata+2),hl
  1545.     ld    bc,5        ;Set up RS-232 parameters
  1546.     ld    de,tdata+4
  1547.     ld    hl,rsdat
  1548.     ldir
  1549. ;
  1550.     ld    b,10H        ;Open RS-232
  1551.     ld    hl,tdata
  1552.     call    rsiox
  1553. ;
  1554. term30:    ld    b,30H        ;Data waiting in buffer?
  1555.     ld    hl,tdata
  1556.     call    rsiox
  1557.     or    a
  1558.     jr    z,term40    ;No
  1559.     ld    b,c        ;Yes, get number (<=240)
  1560. term35:    push    bc        ;Loop to read data and put it onscreen
  1561.     ld    b,50H
  1562.     call    rsiox
  1563.     call    chrout
  1564.     pop    bc
  1565.     djnz    term35
  1566. ;
  1567. term40:    ld    a,(ypofst)    ;Power switch thrown?
  1568.     ld    b,a
  1569.     ld    a,(btryfg)    ;or low battery?
  1570.     or    b
  1571.     jr    nz,term45    ;Yes, bale out
  1572.     call    const        ;Output character waiting?
  1573.     or    a
  1574.     jr    z,term30    ;No
  1575.     call    conin        ;Yes, read it
  1576.     ld    c,a
  1577.     cp    esc        ;ESC?
  1578.     jr    nz,term50    ;No
  1579.     ld    a,(yshfdt)    ;SHIFT pressed?
  1580.     and    3
  1581.     jr    z,term50    ;No
  1582. ;
  1583. term45:    ld    b,20H        ;Close RS-232
  1584.     call    rsiox
  1585.     jp    restrt        ;And exit
  1586. ;
  1587. term50:    push    bc        ;save char in (c)
  1588.     ld    b,60H        ;Output char to RS-232
  1589.     ld    hl,tdata
  1590.     call    rsiox
  1591.     pop    bc        ;restore
  1592.     ld    a,(local)
  1593.     or    a        ;test local
  1594.     jr    z,term40    ;no local echo
  1595.     ld    a,c        ;get char
  1596.     cp    ' '
  1597.     jr    nc,term55    ;>space, just echo
  1598.     cp    bs
  1599.     jr    z,term55    ;bs, echo
  1600.     cp    lf
  1601.     jr    z,term55    ;lf, echo
  1602.     cp    cr
  1603.     jr    z,term55    ;cr, echo
  1604.     push    af        ;else save control char
  1605.     ld    a,'^'
  1606.     call    chrout        ;output control marker
  1607.     pop    af
  1608.     add    a,64        ;make control printable & fall thru
  1609. term55:    call    chrout
  1610.     jr    term40
  1611. ;
  1612. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1613. ;
  1614. tmsg1:
  1615.     cls,'*** Terminal ***',term
  1616. ;
  1617. tmsg2:    cr,lf,lf,'Serial I/O in use by application program',term
  1618. ;
  1619. tmsg3:    esc,'=',0+32,24+32,'SHIFT',cr,lf,lf,esc,'3'
  1620.     'Local? (Y=Yes) ',term
  1621. local:    db 0            ;not 0 for local echo
  1622. ;
  1623. ;------------------------------------------------------------------------------
  1624. ;
  1625.     .xlist
  1626.     if1
  1627.      .printx **
  1628.      .printx * RTX Remover *
  1629.      .printx **
  1630.     endif
  1631.     .list
  1632.     subttl    Remove RTX from memory module
  1633.     page
  1634. ;
  1635. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1636. ;
  1637. unhook:    ld    hl,uhmsg1    ;Menu
  1638.     call    stout1
  1639.     call    hdline
  1640. unhk10:    call    getkey        ;Y or ESC allowable
  1641.     jp    z,exit
  1642.     cp    esc
  1643.     jp    z,restrt
  1644.     res    5,a
  1645.     cp    'Y'
  1646.     jp    nz,unhk10
  1647.     ld    hl,(sbrwrk)    ;If Y, reset CTRL/ESC hook
  1648.     ld    (ctrlesc),hl
  1649.     ld    hl,uhmsg2    ;And say we've done it
  1650.     call    stout1
  1651. unhk20:    call    getkey        ;Get a further ESC
  1652.     jp    z,exit
  1653.     cp    esc
  1654.     jr    nz,unhk20
  1655.     jp    restrt
  1656. ;
  1657. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1658. ;
  1659. uhmsg1:
  1660.     cls,'*** Remove RTX ***',cr,lf,lf,lf
  1661.     'Confirm removal :            Y=yes',term
  1662. ;
  1663. uhmsg2:    esc,'=',3+32,0+32
  1664.     'The CTRL/ESC key has been disabled.',cr,lf        
  1665.     'Use CONFIG to recover the user BIOS space used by RTX.',term
  1666. ;
  1667. ;------------------------------------------------------------------------------
  1668. ;
  1669.     .xlist
  1670.     if1
  1671.      .printx **
  1672.      .printx * RTX Support *
  1673.      .printx **
  1674.     endif
  1675.     .list
  1676.     subttl support routines
  1677.     page
  1678.  
  1679.  
  1680.     .8080                ;set m80
  1681.  
  1682. tddisp:    lda tdup            ;date/time updates allowed?
  1683.     ora a
  1684.     rz                ;no
  1685.     push b
  1686.     push d
  1687.     push h                ;save regs
  1688.     call dateis            ;print date & time
  1689.     pop h
  1690.     pop d
  1691.     pop b                ;restore & exit
  1692.     ret
  1693.  
  1694.  
  1695. hdline:    mvi a,255
  1696.     sta tdup            ;enable time/date update
  1697.     lxi h,escmsg
  1698.     call stout1            ;print 'ESC to exit' message
  1699.     call batcap            ;print battery capacity
  1700.  
  1701.  
  1702. dateis:    call timeis            ;print time
  1703.     lxi h,datpos
  1704.     call stout1            ;position for date
  1705.     lxi h,tdbfr+1            ;mon
  1706.     mvi b,'/'            ;seperator
  1707.     call tdcom            ;print mon
  1708.     call tdcom            ;print day
  1709.     lxi h,tdbfr
  1710.     jmp prtbcd            ;print yr & exit
  1711.  
  1712.  
  1713. timeis:    mvi c,0
  1714.     lxi d,tdbfr
  1715.     call timdat            ;get date/time info in buffer
  1716.     lxi h,timpos
  1717.     call stout1            ;position for time
  1718.     lxi h,tdbfr+3            ;hour
  1719.     mvi b,':'            ;seperator
  1720.     call tdcom            ;prt hr
  1721.     call tdcom            ;prt min & fall thru for second
  1722.  
  1723. prtbcd:    mov a,m                ;get bcd byte @(hl)
  1724.     rar
  1725.     rar
  1726.     rar
  1727.     rar                ;get hi nybble
  1728.     call pbcd1            ;print it
  1729.     mov a,m                ;re-get byte
  1730. pbcd1:    ani 0fh                ;mask
  1731.     ori '0'                ;make ascii
  1732.     jmp chrout            ;and output
  1733.  
  1734. tdcom:    call prtbcd            ;print bcd byte @(hl)
  1735.     mov a,b
  1736.     call chrout            ;print seperator
  1737.     inx h                ;for next byte
  1738.     ret
  1739.  
  1740.  
  1741. batcap:    lxi h,bcpmsg
  1742.     call stout1            ;print battery capacity msg
  1743.     mvi c,3
  1744.     call advcrt            ;get battery vltg (*4)
  1745.     rar                ;/2
  1746.     ani 07eh            ;mask
  1747.     mov c,a
  1748.     mvi a,07eh            ;max vltg (*2)
  1749.     sub c                ;max-now
  1750.     cz bcp1                ;special case, 100%
  1751.     mov c,a
  1752.     mvi b,0                ;bc= 16 bit dif
  1753.     lxi h,bcptbl            ;base addr
  1754.     dad b                ;plus vltg offset
  1755.     mvi b,2
  1756.     call stout2            ;print (b) bytes @(hl)
  1757.     mvi a,'%'
  1758.     jmp chrout            ;print and exit
  1759. bcp1:    push psw            ;save
  1760.     mvi a,'1'
  1761.     call chrout            ;output lead digit
  1762.     pop psw
  1763.     ret
  1764.  
  1765.  
  1766. crlf:    mvi a,cr            ;output crlf
  1767.     call chrout
  1768.     mvi a,lf
  1769.     jmp chrout
  1770.  
  1771.  
  1772. escmsg:    db esc,'=',0+32,30+32        ;row 0, col 30
  1773.     db 'ESC to exit',term
  1774.  
  1775. bcpmsg:    db esc,'=',0+32,44+32        ;row 0, col 44
  1776.     db 'Battery at ',term
  1777. bcptbl:    db '0090807060504030201005'
  1778.  
  1779. datpos:    db esc,'=',0+32,62+32,term    ;row 0, col 62
  1780. timpos:    db esc,'=',0+32,72+32,term    ;row 0, col 72
  1781. tdbfr:    ds 11                ;buffer for date/time info
  1782.  
  1783. tdup:    db 255                ;time/date update enable, 0=no update
  1784.  
  1785.     .z80            ;back to epson code
  1786.  
  1787.  
  1788. stout1:    ld    a,(hl)        ;This outputs a string pointed at by HL to
  1789.     cp    0FFH        ;the console - 0FFH is the terminator. HL
  1790.     ret    z        ;is incremented.
  1791.     call    chrout
  1792.     inc    hl
  1793.     jr    stout1
  1794. ;
  1795. stout2:    ld    a,(hl)        ;This outputs a string pointed at by HL to
  1796.     and    07FH        ;the console after stripping the top bit. The
  1797.     call    chrout        ;number of characters to output are in B -
  1798.     inc    hl        ;no terminator. Its main use is when printing
  1799.     djnz    stout2        ;the RAM disk directory.
  1800.     ret
  1801. ;
  1802. chrout:    push    af        ;This saves all regs and outputs the A reg
  1803.     push    bc        ;to the console.
  1804.     push    de
  1805.     push    hl
  1806.     ld    c,a
  1807.     call    conout
  1808.     pop    hl
  1809.     pop    de
  1810.     pop    bc
  1811.     pop    af
  1812.     ret
  1813. ;
  1814. getkey:    call    const        ;This gets a character from the keyboard. It
  1815.     or    a        ;will not allow auto power off or any other
  1816.     jr    nz,gtky10    ;kind of power off, but will return with Z=1
  1817.     call    tddisp        ;display time & date
  1818.     ld    a,(ypofst)    ;if a power fail (low bat or power-switch)
  1819.     or    a        ;occurs. Otherwise, it will return with Z=0
  1820.     jr    z,getkey    ;and the character in A.
  1821.     xor    a
  1822.     ret
  1823. ;
  1824. gtky10:    call    conin
  1825.     ld    b,a        ;Mental block I had here. How do you clear
  1826.     xor    a        ;the Z flag while not clobbering A?
  1827.     inc    a
  1828.     ld    a,b
  1829.     ret
  1830. ;
  1831. ;------------------------------------------------------------------------------
  1832. ;
  1833. jumptbl:            ;This is where the relocated jump table goes.
  1834. ;
  1835. const:        jp    $
  1836. conin:        jp    $
  1837. conout:        jp    $
  1838. rsopen:        jp    $
  1839. opnprinter:    jp    $
  1840. x63c1a:        jp    $
  1841. advcrt:        jp    $
  1842. readram:    jp    $
  1843. xsysscrn:    jp    $
  1844. xusrscrn:    jp    $
  1845. blkflsh:    jp    $
  1846. rsiox:        jp    $
  1847. timdat:        jp    $
  1848. ;
  1849. ;------------------------------------------------------------------------------
  1850. ;
  1851. tdata:        ds    9
  1852. sbrwrk:        ds    2
  1853. curradr:    ds    2
  1854. currbyt:    ds    2
  1855. hexwork:    ds    4
  1856. flgtbl:        ds    13
  1857. flag:        ds    2
  1858. seq:        ds    2
  1859. rstdft:        ds    1
  1860. oldtrk:        ds    2
  1861. oldsec:        ds    1
  1862. olddma:        ds    2
  1863. ;
  1864. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1865. ;
  1866. rambuf:        ds    128
  1867. ;
  1868. ;------------------------------------------------------------------------------
  1869. ;
  1870. ;
  1871. rtxend:
  1872.  
  1873.     if2
  1874.      .radix 16
  1875.      print_sym <starting: >,%rtxstart
  1876.      print_sym <ending:   >,%rtxend
  1877.      .printx **
  1878.      .radix 10
  1879.     endif
  1880.  
  1881.     subttl *** Macros and Symbols ***
  1882.  
  1883.         end
  1884.