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 / OSBORNE / MEX01OVL.ZIP / MXO-OS36.AQM / MXO-OS36.ASM
Assembly Source File  |  2000-06-30  |  64KB  |  2,686 lines

  1. PAGE 62
  2. TITLE 'MEX-Overlay for OSBORNE 1 V 3.6'
  3.  
  4. MACLIB Z80        ; you need the MAC assembler from Digital Research
  5.  
  6. ; 19 NOV 90
  7.  
  8. REV    EQU    36
  9.  
  10. ; author:
  11. ; Klaus Schauer
  12. ; Auf den Kempen 31
  13. ; D-4052 Korschenbroich 2
  14. ; Germany (West)
  15.  
  16. ; most of the routines based on the overlays
  17. ; MXO-OS24(22).ASM and MXO-SM16(14).ASM
  18.  
  19. ; see MXO-OS36.DOC for more information
  20.  
  21. YES    EQU    0FFH
  22. NO    EQU    0
  23.  
  24. ; Assembler switches
  25.  
  26. NUMRES    EQU    YES    ;YES = interpret numeric modem dial result code
  27. DSCDTR    EQU    YES    ;NO  = disconnect modem only with ATH
  28. SWTASK    EQU    YES    ;YES = ask you for hardware baud switching
  29. SETPEEK    EQU    NO    ;YES = overlay with PEEK-routine 
  30. VTDEBUG EQU    YES    ;YES = unknown VT100 control chars displayd
  31.  
  32. ; ASCII constants
  33.  
  34. BELL    EQU    7    ;Bell
  35. BS    EQU    8    ;Backspace (Cursor Left)
  36. TAB    EQU    9    ;Tabulator
  37. LF    EQU    0Ah    ;Linefeed
  38. VT    EQU    0Bh    ;Vertical Tab
  39. FF    EQU    0Ch    ;Form Feed
  40. CR    EQU    0Dh    ;Carriage Return
  41. XON    EQU    11h    ;Device Control 1
  42. XOFF    EQU    13h    ;Device Control 3
  43. CAN    EQU    18h    ;Cancel
  44. SUBST    EQU    1Ah    ;Substitute
  45. ESC    EQU    1Bh    ;Escape
  46. FS    EQU    1Ch    ;File Separator
  47. GS    EQU    1Dh    ;Group Separator
  48. RS    EQU    1Eh    ;Record Separator
  49. US    EQU    1Fh    ;Unit Separator
  50. SPACE    EQU    20h    ;Space
  51. DEL    EQU    7Fh    ;Delete
  52.  
  53. ; OSBORNE 1 control chars
  54.  
  55. DOWN    EQU    0Ah    ;Cursor Down
  56. UP    EQU    0Bh    ;Cursor Up
  57. RIGHT    EQU    0Ch    ;Cursor RightèCLRSCR    EQU    1Ah    ;Clear Screen 
  58. HOME    EQU    1Eh    ;Home Cursor
  59.  
  60. ; MEX system constants
  61.  
  62. MEX    EQU    0D00h    ;CALL MEX-Service-Routine
  63.  
  64. INMDM    EQU    255    ;RETURN CHAR FROM MDM IN A, CY=NO CHR IN 100MS
  65. TIMER    EQU    254    ;delay 100ms * reg B
  66. TMDINP    EQU    253    ;B=# sec to wait for Char, CY=no Char
  67. CHEKCC    EQU    252    ;check for ^C from KBD, Z=Present
  68. SNDRDY    EQU    251    ;Test for Modem-Send-Ready
  69. RCVRDY    EQU    250    ;Test for Modem-Receive-Ready
  70. SNDCHR    EQU    249    ;send a Character to the Modem (after SNDRDY) 
  71. RCVCHR    EQU    248    ;recv. a Char from Modem (after RCVRDY)
  72. LOOKUP    EQU    247    ;table search: see CMDTBL comments for info
  73. PARSFN    EQU    246    ;parse filename from input stream
  74. BDPARS    EQU    245    ;parse baud-rate from input stream
  75. SBLANK    EQU    244    ;scan input stream to next non-blank
  76. EVALA    EQU    243    ;evaluate numeric from input stream
  77. LKAHED    EQU    242    ;get nxt char w/o removing from input
  78. GNC    EQU    241    ;get char from input, cy=1 if none
  79. ILP    EQU    240    ;inline print
  80. DECOUT    EQU    239    ;decimal output
  81. PRBAUD    EQU    238    ;print baud rate
  82.  
  83. INBUF    EQU    10    ;input buffer, same structure as BDOS 10
  84. PRINT    EQU    9    ;simulated BDOS function 9: print string
  85. IN$OUT    EQU    6    ;simulated BDOS function 6: direct input/output
  86. CONOUT    EQU    2    ;simulated BDOS function 2: console char out
  87. CONIN    EQU    1    ;simulated BDOS funktion 1: console char in
  88.  
  89. START    EQU    0EB9h        ;JMP addr. to MEX1.14 START
  90. CONVEC    EQU    47F4h        ;JMP addr. to console output vector
  91.                 ;Note: MEX1.12 -> CONVEC: EQU 468EH
  92.                 ;      MEX1.14 -> CONVEC: EQU 47F4H
  93. SEND$VEC    EQU    4F09h    ;JMP addr. to sendfile-prompt
  94.                 ;set PARITV: to YES included
  95.  
  96. ; OSBORNE 1 and CP/M system constants
  97.  
  98. BOOT    EQU    0    ; CP/M BOOT ADDRESS
  99. JTABL    EQU    BOOT+1    ; CP/M JUMP TABLE ADDRESS
  100. BDOS    EQU    5
  101. TPA    EQU    0100h
  102.  
  103. SCRNPAC    EQU    02400h    ;Screen-Pac status register
  104. MODCTLP    EQU    02A00h    ;status register for serial port
  105. MODDATP    EQU    MODCTLP+1 ;data resister for serial port
  106. VICTLA    EQU    02C01h    ;Video status register A
  107. ROMRAM    EQU    0EF08h    ;(1) Bank switch flag: 0 = ROM , 1 = RAM 
  108. CURS    EQU    0EF5Ah    ;CBIOS-addr. for current cursor position
  109.             ; (CURS+1)  (CURS)
  110.             ; -------- --------
  111.             ; 1111RRRR RCCCCCCC    R = row, C = column
  112.  
  113. LLIMIT    EQU    0EF6Ch    ;CBIOS-addr. for max. #column in a logical line
  114. IESTK    EQU    0EF6Fh    ;save Stack Pointer here
  115. ISTK    EQU    0EF99h    ;interrupt stack
  116. INTBL    EQU    0EFF0h    ;(16) interrupt vector table
  117.  
  118. AHSENB    EQU    68h    ;CBIOS-offset to scroll flag
  119. SCRSZE    EQU    6Ah    ;CBIOS-offset to screen sizeèCRSUP    EQU    7Fh    ;CBIOS-offset of vector to cursor up
  120. PLUGH    EQU    00A5h    ;CBIOS-offset to Screen-Pac status byte 
  121. MAGIC    EQU    03E5h    ;CBIOS-offset to Sto-Plugh-subroutine (Screen-Pac)
  122.  
  123. ; values to send to 6850 control register for
  124. ; 8 bits, no parity, 1 stop bit
  125. ; Various bit patterns for the 6850
  126.  
  127. RESET    EQU    00000011b    ;reset 6850
  128. BAUD3    EQU    00000010b    ;300 baud
  129. BAUD12    EQU    00000001b    ;1200 baud
  130. BAUDMSK    EQU    00000011b    ;mask to get baud rate bits
  131. BITMSK    EQU    00011100b    ;mask to get parity, etc. bits
  132. RTSBIT    EQU    01000000b    ;setting this bit turns RTS OFF
  133. BRKBIT    EQU    01100000b    ;bits to set to send break
  134. MODSNDB    EQU    00000010b    ;bit to test for ready to send
  135. MODSNDR    EQU    00000010b    ;modem send ready when high
  136. MODRCVB    EQU    00000001b    ;bit to test for received data
  137. MODRCVR    EQU    00000001b    ;modem receive ready when high
  138.  
  139.  
  140.     ORG    TPA
  141.     JMP    START        ;MEX has a JMP START here
  142. PMMIMODEM:    DB    NO    ;yes=PMMI S-100 Modem            103H
  143. SMARTMODEM:    DB    YES    ;yes=HAYES Smartmodem, no=non-PMMI    104H
  144. TOUCHPULSE:    DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  145. CLOCK:        DB    40    ;clock speed in MHz x10, 25.5 MHz max.    106H
  146.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  147. MSPEED:        DB    6    ;0=110 1=300 2=450 3=600 4=710 5=1200   107H
  148.                 ;6=2400 7=4800 8=9600 9=19200 default
  149. BYTDLY:        DB    1    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms   108H
  150.                 ;default time to send character in ter-
  151.                 ;minal mode file transfer for slow BBS.
  152. CRDLY:        DB    1    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  153.                 ;default time for extra wait after CRLF
  154.                 ;in terminal mode file transfer
  155. NOOFCOL:    DB    5    ;number of DIR columns shown        10AH
  156. SETUPTST:    DB    YES    ;yes=user-added Setup routine        10BH
  157. SCRNTEST:    DB    YES    ;cursor control routine         10CH
  158. ACKNAK:        DB    YES    ;yes=resend a record after any non-ACK    10DH
  159.                 ;no=resend a record after a valid NAK
  160. BAKUPBYTE:    DB    YES    ;yes=change any file same name to .BAK    10EH
  161. CRCDFLT:    DB    YES    ;yes=default to CRC checking        10FH
  162. TOGGLECRC:    DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  163. CONVBKSP:    DB    NO    ;yes=convert backspace to rub        111H
  164. TOGGLEBK:    DB    YES    ;yes=allow toggling of bksp to rub    112H
  165. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  166.                 ;terminal mode (added by remote echo)
  167. TOGGLELF:    DB    YES    ;yes=allow toggling of LF after CR    114H
  168. TRANLOGON:    DB    NO    ;yes=allow transmission of logon    115H
  169.                 ;write logon sequence at location LOGON
  170. SAVCCP:        DB    NO    ;no=do not save CCP, may be overwritten 116H
  171. LOCONEXTCHR:    DB    NO    ;yes=local command if EXTCHR precedes    117H
  172.                 ;no=external command if EXTCHR precedes
  173. TOGGLELOC:    DB    YES    ;yes=allow toggling of LOCONEXTCHR    118HèLSTTST:        DB    YES    ;yes=printer available on printer port    119H
  174. XOFFTST:    DB    NO    ;yes=checks for XOFF from remote while    11AH
  175.                 ;sending a file in terminal mode
  176. XONWAIT:    DB    NO    ;yes=wait for XON after CR while    11BH
  177.                 ;sending a file in terminal mode
  178. TOGXOFF:    DB    YES    ;yes=allow toggling of XOFF checking    11CH
  179. IGNORCTL:    DB    NO     ;yes=CTL-chars above ^M not displayed    11DH
  180. EXTRA1:        DB    0    ;for future expansion            11EH
  181. EXTRA2:        DB    0    ;for future expansion            11FH
  182. BRKCHR:        DB    '@'-40H    ;^@ = Send a 300 ma. break tone        120H
  183. NOCONNCT:    DB    'N'-40H    ;^N = Disconnect from the phone line    121H
  184. LOGCHR:        DB    'W'-40H    ;^W = Send logon            122H
  185. LSTCHR:        DB    'P'-40H    ;^P = Toggle printer            123H
  186. UNSAVE:        DB    'R'-40H    ;^R = Close input text buffer        124H
  187. TRANCHR:    DB    'T'-40H ;^T = Transmit file to remote        125H
  188. SAVECHR:    DB    'Y'-40H    ;^Y = Open input text buffer        126H
  189. EXTCHR:        DB    '\'-40H    ;^\ = Send next character        127H
  190.         DS    2    ;                    128H
  191. IN$MODCTLP:    JMP    OSTAT        ;get serial port status        12AH
  192.         DS    7
  193. OUT$MODDATP:    JMP    CHN$OUTPUT    ;send chars to the serial port    134H
  194.         DS    7        ;(CHNOUT: & OSOUT:)
  195. IN$MODDATP:    JMP    OSIN        ;get a char from the serial     13EH
  196.         DS    7        ;port (OSIN: & CHNIN:) 
  197. ANI$MODRCVB:    ANI    MODRCVB ! RET    ;bit to test for receive ready    148H
  198. CPI$MODRCVR:    CPI    MODRCVR ! RET    ;value of rcv. bit when ready    14BH
  199. ANI$MODSNDB:    ANI    MODSNDB ! RET    ;bit to test for send ready    14EH
  200. CPI$MODSNDR:    CPI    MODSNDR ! RET    ;value of send bit when ready    151H
  201. DCDTST:        JMP    DCDVEC        ; Data carrier detect        154H
  202. RNGDET:        JMP    RNGVEC        ; Ring detect            157H
  203.  
  204. ; Overlay data I (only for overlay functions)
  205.  
  206. MODCTB:        DB    11010101b    ;Modem Control Byte
  207.                     ;Receive Interrupt Enable
  208.                     ;MODEM port 8N1
  209.                     ;10010110b = 300 bps / 600 bps
  210.                     ;10010101b = 1200 bps / 2400 bps
  211.                     ;RS-232 port (V.24) 8N1
  212.                     ;11010110b = 300 bps / 600 bps
  213.                     ;11010101b = 1200 bps / 2400 bps
  214. MODIOB:        DB    00000000b    ;Modem Input - Output byte
  215.                     ;Bit 0 = FT (File Transmit active)
  216.                     ;set by NOPARV and PARITV to
  217.                     ;switch char tables on/off
  218.                     ;Bit 1 = VT (VT Emulation active)
  219.                     ;Bit 2 = II (IBM to ASCII Input conv.)
  220.                     ;Bit 3 = IO (ASCII to IBM Output conv.)
  221.                     ;Bit 4 = KP (VT Keypad Mode active)
  222.                     ;Bit 5 = PFK (VT PF-Key Flag)
  223.                     ;Bit 6 = DSF (Direct Send Flag)
  224.                     ;Bit 7 = SOC (Send Original Char Bit)
  225.         DS    2
  226. DSCDTR1:    DB    YES        ;NO= disconnect only with ATH    
  227.  
  228. JMP$SMDISC:    JMP    DISCON1        ;disconnect with ATH        15FH
  229. DAILV:        JMP    DIAL        ;                162H
  230. JMP$DISCON:    JMP    DISCON        ;disconnect with DTR or ATH    165H
  231. JMP$GOODBYE:    JMP    GOODBYE        ;called before exit to CP/M    168H
  232. JMP$INITMOD:    JMP    INITMOD        ;init OSBORNE 1 and Modem    16BH
  233. JMP$NEWBD:    JMP    NEWBD        ;support optional NEWBD        16EH
  234. NOPARV:        JMP    TBL$ON        ;converting chars on         171H
  235. PARITV:        JMP    TBL$OFF        ;converting chars off        174H
  236. JMP$SETUPR:    JMP    SETUPR        ;                177H
  237. JMP$SPCLMENU:    RET  !  NOP  !  NOP    ;not used with MEX        17AH
  238. JMP$SYSVER:    JMP    SYSVER        ;                17DH
  239. JMP$BREAK:    JMP    SENDBRK        ;                180H
  240.  
  241. ; Do not change the following six lines.è
  242. JMP$ILPRT:    DS    3        ;                183H
  243. JMP$INBUF    DS    3        ;                186H
  244. JMP$INLNCOMP:    DS    3        ;                189H
  245. JMP$INMODEM    DS    3        ;                18CH
  246. JMP$NXTSCRN:    DS    3        ;                18FH
  247. JMP$TIMER:    DS    3        ;                192H
  248.  
  249. CLREOS:        RET            ;no clear to the end of screen    195H
  250.         DB    0,0,0,0,0,0,0,0
  251.  
  252. CLRSCRN:    MVI    E,CLRSCR    ;clear screen, home cursor    19EH
  253.         MVI    C,IN$OUT
  254.         JMP    MEX
  255.  
  256. ; end of fixed area
  257.  
  258. ;    ORG    0200H        ;overlay start for MEX V2.0
  259.  
  260. SYSVER:    LXI    D,SOMESG
  261.     MVI    C,PRINT
  262.     CALL    MEX
  263.     CALL    BDSHOW    
  264.     CALL    BTSHOW 
  265.     JMP    CRLF
  266.  
  267. ; If you put a routine in here, it should NOT do a disconnect when
  268. ; using MEX.  That's handled by the DISCON routine.
  269.  
  270. GOODBYE:
  271.     MVI    C,01010101b    ;set serial port to RS-232 (V.24),
  272.     CALL    OSET1        ;1200 bps, and no interrupt 
  273.     JMP    CLRSCRN        ;clear screen
  274.  
  275. ; This is the Osborne initialization routine.
  276.  
  277. INITMOD:
  278.  
  279. ; Set serial port interrupt
  280.  
  281. ; OSBORNE 1 is set to MODE 2 Interrupts.
  282. ; The interrupt tabel is set to EF..h (I = EFh).
  283. ; The hardware supported three interrupt inputs
  284. ;  /IRQ0 from the serial port, low byte of the INT vector is FCh =>> EFFCh
  285. ;  /IRQ1 from the keyboard, low byte is F8h =>> EFF8h
  286. ;  /IRQ2 from the parallel port, low byte is F0h =>> EFF0h
  287. ; OSBORNE's CBIOS only use keyboard interrupt. At the location EFF8h the
  288. ; vector 06FCh points to the ROM BIOS keyboard interrupt routine.
  289. ; The highest priority has /IRQ2.
  290.  
  291.     LXI    H,SERINT    ;load address of the serial INT routine
  292.     SHLD    INTBL+0Ch    ;set serial interrupt vector    
  293.  
  294. ; Set serial port parameter and init modem.
  295.  
  296.     MVI    A,0FFH
  297.     STA    MSPEED1        ;set (MSPEED1) = FF to init serial port
  298.     LDA    MSPEED        ;load init speed
  299.     CALL    NEWBD1        ;set baud rate
  300.     RET
  301.  
  302. ; SET-command extention
  303. ; Control is passed here after MEX parses a SET command.
  304.  
  305. SETUPR:    MVI    C,SBLANK    ;any arguments?
  306.     CALL    MEX
  307.     JC    SETSHO        ;if not, go print out values
  308.     LXI    D,CMDTBL1    ;parse command
  309.     CALL    TSRCH        ;from table
  310.     PUSH    H        ;any address on stack
  311.     RNC            ;if we have one, execute it
  312.     POP    H        ;nope, fix stack
  313. SETERR:    LXI    D,SETEMS    ;print error
  314.     MVI    C,PRINT
  315.     JMP    MEX
  316.  
  317. ; SET command table ... note that tables are constructed of command-
  318. ; name (terminated by high bit=1) followed by word-data-value returned
  319. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  320. ; a binary zero.
  321.  
  322. ; Note that LOOKUP attempts to find the next item in the input streamè; in the table passed to it in HL ... if found, the table data item is
  323. ; returned in HL; if not found, LOOKUP returns carry set.
  324.  
  325. CMDTBL1:
  326.     DB    '?'+80H        ;set ?
  327.     DW    STHELP1
  328.     DB    'BAU','D'+80H    ;set baud
  329.     DW    BAUDST
  330.     DB    'BIT','S'+80H    ;set bits
  331.     DW    STBITS
  332.     DB    'DIA','L'+80H    ;set dial
  333.     DW    TODIAL
  334.     DB    'I','N'+80H    ;set ASCII/IBM input chars
  335.     DW    SET$IN
  336.     DB    'OU','T'+80H    ;set ASCII/IBM output chars
  337.     DW    SET$OUT 
  338.     DB    'VT10','0'+80H    ;set VT100 emulation
  339.     DW    SET$VT
  340.     DB    0        ;table terminator
  341.  
  342. ; SET ?  processor
  343.  
  344. STHELP1:
  345.     LXI    D,HLPMSG1
  346.     MVI    C,PRINT
  347.     JMP    MEX
  348.  
  349. ; SET BAUD processor
  350.     
  351. BAUDST:    MVI    C,BDPARS    ;function code
  352.     CALL    MEX        ;let MEX look up code
  353.     JC    SETERR        ;invalid code
  354.     CALL    NEWBD1        ;no, try to set it
  355.     JC    SETERR        ;not-supported code
  356.     CALL    CRLF
  357.     LDA    MODCTB
  358.     ANI    RTSBIT
  359.     CNZ    BDSWITCH    ;IF RS232 on -> print Switch-Msg.
  360.     CALL    BDSHOW
  361.     CALL    CRLF
  362.     JMP    CRLF
  363.  
  364. BDSHOW:    CALL ILPRT
  365.     DB    ESC,')',0
  366.     LDA    MSPEED
  367.     MVI    C,PRBAUD    ;use MEX routine
  368.     CALL    MEX
  369.     CALL    ILPRT
  370.     DB    BS,BS,BS,BS,ESC,'( Baud ',0
  371.     RET
  372.  
  373. ; SET BITS    number of bits, parity and number of stop bits
  374.  
  375. STBITS:    LXI    D,BITTBL    ;point to table of commands
  376.     CALL    TSRCH        ;  and search it
  377.     JC    SSETERR
  378.     LDA    MODCTB
  379.     ANI    NOT BITMSK    ;zero number of bits
  380.     ORA    L        ;  and put in new value
  381.     STA    MODCTB
  382.     CALL    OSET        ;send to 6850
  383.     CALL    CRLFè    CALL    BTSHOW
  384.     JMP    CRLF
  385.  
  386. BTSHOW:    LDA    MODCTB        ;6850 control register image
  387.     ANI    BITMSK        ;keep only the parity etc. bits
  388.     LXI    H,SAYTBL    ;start of jump table for text routines
  389.     RRC            ;correct to provide offset into table
  390.     MOV    E,A
  391.     MVI    D,0        ;DE now has offset
  392.     DAD    D        ;HL now points to correct entry in table
  393.     MOV    E,M
  394.     INX    H
  395.     MOV    D,M        ;DE now has address of correct routine
  396.     PUSH    D
  397.     RET            ;jump to it
  398.  
  399. ; These are the routines to display character length, parity and number
  400. ; of stop bits.  The bits for these values are not independent in the 6850
  401. ; which makes this code the easiest way to do it.
  402.  
  403. SAY7E2:    CALL    SAY7
  404.     CALL    SAYHE
  405.     JMP    SAYH2
  406.  
  407. SAY7O2:    CALL    SAY7
  408.     CALL    SAYHO
  409.     JMP    SAYH2
  410.  
  411. SAY7E1:    CALL    SAY7
  412.     CALL    SAYHE
  413.     JMP    SAYH1
  414.  
  415. SAY7O1:    CALL    SAY7
  416.     CALL    SAYHO
  417.     JMP    SAYH1
  418.  
  419. SAY8N2:    CALL    SAY8
  420.     CALL    SAYN
  421. SAYH2:    CALL    ILPRT
  422.     DB    ESC,')2',0
  423. SAYSS:    CALL    ILPRT
  424.     DB    ESC,'( Stop Bits',CR,LF,0
  425.     RET
  426.  
  427. SAY8N1:    CALL    SAY8
  428.     CALL    SAYN
  429.     JMP    SAYH1
  430.  
  431. SAY8E1:    CALL    SAY8
  432.     CALL    SAYHE
  433.     JMP    SAYH1
  434.  
  435. SAY8O1:    CALL    SAY8
  436.     CALL    SAYHO
  437. SAYH1:    CALL    ILPRT
  438.     DB    ESC,')1',0
  439.     CALL    ILPRT
  440.     DB    ESC,'( Stop Bit',CR,LF,0
  441.     RET
  442.  
  443. SAY7:    CALL    ILPRT
  444.     DB    ESC,')7',0è    JMP    SAYBITS
  445.  
  446. SAY8:    CALL    ILPRT
  447.     DB    ESC,')8',0
  448. SAYBITS:
  449.     CALL    ILPRT
  450.     DB    ESC,'( Bits   ',0
  451.     RET
  452.  
  453. SAYHE:    CALL    ILPRT
  454.     DB    ESC,')EVEN',0
  455.     JMP    SAYPAR
  456.  
  457. SAYHO:    CALL    ILPRT
  458.     DB    ESC,')ODD',0
  459.     JMP    SAYPAR
  460.  
  461. SAYN:    CALL    ILPRT
  462.     DB    ESC,')NO',0
  463. SAYPAR:    CALL    ILPRT
  464.     DB    ESC,'( Parity   ',0
  465.     RET
  466.  
  467. ; jump table for the bit text output routines
  468.  
  469. SAYTBL:    DW    SAY7E2
  470.     DW    SAY7O2
  471.     DW    SAY7E1
  472.     DW    SAY7O1
  473.     DW    SAY8N2
  474.     DW    SAY8N1
  475.     DW    SAY8E1
  476.     DW    SAY8O1
  477.  
  478. ; table for BITS
  479.  
  480. BITTBL:    DB    '7E','2'+80H
  481.     DW    0000H
  482.     DB    '7O','2'+80H
  483.     DW    0004H
  484.     DB    '7E','1'+80H
  485.     DW    0008H
  486.     DB    '7O','1'+80H
  487.     DW    000CH
  488.     DB    '8N','2'+80H
  489.     DW    0010H
  490.     DB    '8N','1'+80H
  491.     DW    0014H
  492.     DB    '8E','1'+80H
  493.     DW    0018H
  494.     DB    '8O','1'+80H
  495.     DW    001CH
  496.     DB    0        ;<<== table terminator
  497.  
  498. ; SET DIAL    DIAL MODE
  499.  
  500. TODIAL:    LDA    TOUCHPULSE
  501.     XRI    54H XOR 50H    ;toggle 'T' and 'P'
  502.     STA    TOUCHPULSE
  503.     CALL    CRLF
  504.     CALL    DLSHOW
  505.     JMP    CRLFè
  506. DLSHOW:    LDA    TOUCHPULSE
  507.     CPI    'P'
  508.     JRNZ    TMSG
  509.     CALL    ILPRT
  510.     DB    ESC,')PULSE',ESC,'(',0
  511. DLEND:    CALL    ILPRT
  512.     DB    ' Dialing',CR,LF,0
  513.     RET
  514.  
  515. TMSG:    CALL    ILPRT
  516.     DB    ESC,')TONE',ESC,'(',0
  517.     JMP    DLEND 
  518.  
  519. ; SET CHAR    toggle converting input IBM code to ASCII code
  520.  
  521. SET$IN:    LDA    MODIOB        ;load MODIOB
  522.     XRI    00000100b    ;toggle II flag 
  523.     STA    MODIOB        ;save it
  524.     CALL    CRLF
  525.     CALL    CHR$SHOW
  526.     JMP    CRLF
  527.  
  528. SET$OUT:
  529.     LDA    MODIOB        ;load MODIOB
  530.     XRI    00001000b    ;toggle IO flag
  531.     STA    MODIOB        ;save it
  532.     CALL    CRLF
  533.     CALL    CHR$SHOW
  534.     JMP    CRLF
  535.  
  536. CHR$SHOW:
  537.     LDA    MODIOB
  538.     BIT    2,A        ;test II flag
  539.     JRZ    ASCII$IN
  540.     CALL    ILPRT
  541.     DB    ESC,')IBM',0
  542.     JR    CHR$PR$IN
  543.  
  544. ASCII$IN:
  545.     CALL    ILPRT
  546.     DB    ESC,')ASCII',0
  547. CHR$PR$IN:
  548.     CALL    ILPRT
  549.     DB    ESC,'( Char Input  ',0
  550.     LDA    MODIOB
  551.     BIT    3,A        ;test IO flag
  552.     JRZ    ASCII$OUT
  553.     CALL    ILPRT
  554.     DB    ESC,')IBM',0
  555.     JR    CHR$PR$OUT
  556.  
  557. ASCII$OUT:
  558.     CALL    ILPRT
  559.     DB    ESC,')ASCII',0
  560. CHR$PR$OUT:
  561.     CALL    ILPRT
  562.     DB    ESC,'( Char Output',CR,LF,0
  563.     RET
  564.  
  565. SET$VT:    LXI    H,MODIOB
  566.     MOV    A,M        ;load MODIOB
  567.     XRI    00000010b    ;toggle VT flagè    RES    4,A        ;reset KP, disable Keypad Mode
  568.     MOV    M,A        ;save it
  569.     CALL    CRLF
  570.     CALL    VT$SHOW
  571.     JMP    CRLF
  572.  
  573. VT$SHOW:
  574.     CALL    ILPRT
  575.     DB    'VT100 emulation ',ESC,')O',0
  576.     LDA    MODIOB
  577.     BIT    1,A
  578.     JRZ    VT$OFFMSG
  579.     CALL    ILPRT
  580.     DB    'N',ESC,'(',CR,LF,0
  581.     RET
  582.  
  583. VT$OFFMSG:
  584.     CALL    ILPRT
  585.     DB    'FF',ESC,'(',CR,LF,0
  586.     RET
  587.  
  588. ; SSET command extention
  589. ; Control is passed here after MEX parses a SSET command.
  590.  
  591. SSET:    MVI    C,SBLANK    ;any arguments?
  592.     CALL    MEX
  593.     JC    SETSHO        ;if not, go print out values
  594.     LXI    D,CMDTBL    ;parse command
  595.     CALL    TSRCH        ;from table
  596.     PUSH    H        ;any address on stack
  597.     RNC            ;if we have one, execute it
  598.     POP    H        ;nope, fix stack
  599.  
  600. SSETERR:
  601.     LXI    D,SETEMS    ;print error
  602.     MVI    C,PRINT
  603.     JMP    MEX
  604.  
  605. ; SSET command table  ...see SET command table for more information
  606.  
  607. CMDTBL:    DB    '?'+80H        ;"set ?"
  608.     DW    STHELP
  609.     DB    'POR','T'+80H    ;"set rts"
  610.     DW    STRTS
  611.     DB    'WIDT','H'+80H    ;"set width"
  612.     DW    STWID
  613.     DB    'SCROL','L'+80H    ;"set scroll"
  614.     DW    STSCRL
  615.     DB    'ARRO','W'+80H    ;"set arrow"
  616.     DW    STARR
  617. IF SETPEEK
  618.     DB    'PEE','K'+80H    ;"peek memory"
  619.     DW    PEEK
  620. ENDIF
  621.     DB    'SCREE','N'+80H    ;"set physical width"
  622.     DW    SETSCREEN
  623.     DB    0        ; table terminator
  624.  
  625. ; SET/SSET <no-args>: print current statistics
  626.  
  627. SETSHO:    LXI    H,SHOTBL    ;get table of SHOW subroutinesèSETSLP:    MOV    E,M        ;get table address
  628.     INX    H
  629.     MOV    D,M
  630.     INX    H
  631.     MOV    A,D        ;end of table?
  632.     ORA    E
  633.     RZ            ;exit if so
  634.     PUSH    H        ;save table pointer
  635.     XCHG            ;adrs to HL
  636.     CALL    GOHL        ;do it
  637.     CALL    CRLF        ;print newline
  638.     MVI    C,CHEKCC    ;check for console abort
  639.     CALL    MEX
  640.     POP    H        ;it's done
  641.     JRNZ    SETSLP        ;continue if no abort
  642.     RET
  643.  
  644. GOHL:    PCHL
  645.  
  646. ; table of SHOW subroutines
  647.  
  648. SHOTBL:    DW    TBL$HEAD
  649.     DW    BDSHOW
  650.     DW    BTSHOW
  651.     DW    DLSHOW
  652.     DW    RTSHOW
  653.     DW    CHR$SHOW
  654.     DW    VT$SHOW
  655.     DW    WDSHOW
  656.     DW    SCRSHOW
  657.     DW    SCSHOW
  658.     DW    ARSHOW
  659.     DW    0        ;<<== table terminator
  660.  
  661. TBL$HEAD:
  662.     CALL    ILPRT
  663.     DB    CLRSCR,'(',ESC,')S',ESC,'()',ESC,')SET ',ESC,'(switches'
  664.     DB    CR,LF,0
  665.     RET
  666.  
  667. ; SSET ?  processor
  668.  
  669. STHELP:    LXI    D,HLPMSG
  670.     MVI    C,PRINT
  671.     JMP    MEX
  672.  
  673. ; SSET SCROLL    toggle Auto Scroll
  674.  
  675. STSCRL:    LHLD    JTABL        ;first page of bios
  676.     MVI    L,AHSENB    ;offset of scroll flag
  677.     MOV    A,M
  678.     XRI    0FFH        ;toggle it
  679.     MOV    M,A
  680.     CALL    CRLF
  681.     CALL    SCSHOW
  682.     JMP    CRLF
  683.  
  684. SCSHOW:    CALL    ILPRT
  685.     DB    'Auto-scroll ',ESC,')O',0
  686.     LHLD    JTABL        ;first page of bios
  687.     MVI    L,AHSENB    ;offset of scroll flag
  688.     MOV    A,Mè    ORA    A
  689.     JRZ    OFFMSG
  690.     CALL    ILPRT
  691.     DB    'N',ESC,'(',CR,LF,0
  692.     RET
  693.  
  694. OFFMSG:    CALL    ILPRT
  695.     DB    'FF',ESC,'(',CR,LF,0
  696.     RET
  697.  
  698. ; SSET WIDTH    screen width
  699.  
  700. STWID:    MVI    C,EVALA
  701.     CALL    MEX        ;get numeric
  702.     MOV    A,H        ;validate
  703.     ORA    A
  704.     JNZ    SSETERR
  705.     MOV    A,L
  706.     CPI    30        ;30 seems small enough
  707.     JC    SSETERR
  708.     CPI    129        ;128 is max
  709.     JNC    SSETERR
  710.     STA    LLIMIT        ;screen width byte
  711.     LHLD    JTABL        ;first page of CBIOS
  712.     MVI    L,SCRSZE    ;CBOIS-offset to width byte for SETUP.COM
  713.     MOV    M,A
  714.     CALL    CRLF
  715.     CALL    WDSHOW
  716.     JMP    CRLF
  717.  
  718. WDSHOW:    CALL    ILPRT
  719.     DB    'Screen Width ',ESC,')',0
  720.     LDA    LLIMIT
  721.     MOV    L,A
  722.     MVI    H,0
  723.     MVI    C,DECOUT
  724.     CALL    MEX
  725.     CALL    ILPRT
  726.     DB    ESC,'(',CR,LF,0
  727.     RET
  728.  
  729. ; SSET ARROW    toggle arrow keys
  730.  
  731. STARR:    LHLD    JTABL        ;first page of bios
  732.     MVI    L,CRSUP        ;offset of vector to cursor up
  733.     MOV    E,M
  734.     INX    H
  735.     MOV    D,M
  736.     XCHG            ;hl now points to cursor up
  737.     MOV    A,M
  738.     XRI    0BH XOR 05H    ;toggle cursor up
  739.     MOV    M,A
  740.     INX    H
  741.     MOV    A,M
  742.     XRI    0CH XOR 04H    ;toggle cursor right
  743.     MOV    M,A
  744.     INX    H
  745.     MOV    A,M
  746.     XRI    0AH XOR 18H    ;toggle cursor down
  747.     MOV    M,A
  748.     INX    H
  749.     MOV    A,Mè    XRI    08H XOR 13H    ;toggle cursor left
  750.     MOV    M,A
  751.     CALL    CRLF
  752.     CALL    ARSHOW
  753.     JMP    CRLF
  754.  
  755. ARSHOW:    CALL    ILPRT
  756.     DB    'Arrow Keys ',ESC,')',0
  757.     LHLD    JTABL        ;first page of bios
  758.     MVI    L,CRSUP        ;offset of vector to cursor up key
  759.     MOV    E,M
  760.     INX    H
  761.     MOV    D,M
  762.     XCHG            ;hl points to cursor up
  763.     MOV    A,M
  764.     CPI    0BH
  765.     JRZ    CPMSG
  766.     CALL    ILPRT
  767.     DB    'WS',ESC,'(',CR,LF,0
  768.     RET
  769.  
  770. CPMSG:    CALL    ILPRT
  771.     DB    'CPM',ESC,'(',CR,LF,0
  772.     RET
  773.  
  774. ; SSET PORT    toggle serial ports
  775.  
  776. STRTS:    LDA    MODCTB
  777.     XRI    RTSBIT        ;toggle the RTS bit
  778.     STA    MODCTB
  779.     CALL    OSET
  780.     CALL    CRLF
  781.     CALL    RTSHOW
  782.     JMP    CRLF
  783.  
  784. RTSHOW:    CALL    ILPRT
  785.     DB    ESC,')',0
  786.     LDA    MODCTB
  787.     ANI    RTSBIT
  788.     JRNZ    INMSG    
  789.     CALL    ILPRT
  790.     DB    'MODEM',0
  791. ACTMSG:    CALL    ILPRT
  792.     DB    ESC,'(',' port on',CR,LF,0
  793.     RET
  794.  
  795. INMSG:    CALL    ILPRT
  796.     DB    'RS232',0
  797.     JR    ACTMSG
  798.  
  799. ; SET SCREEN (SCREEN PAC physical width)
  800.  
  801. SETSCREEN:
  802.     CALL    SCRNFLG        ;liefert immer 11110000B ??? Fehler ???
  803.     ANI    04H
  804.     JNZ    SSETERR        ;no SCREEN PAC installed
  805.     LXI    D,SCRTBL
  806.     CALL    TSRCH
  807.     JC    SSETERR
  808.     MOV    A,L
  809.     LHLD    JTABL        ;load CBIOS address
  810.     MVI    L,PLUGH        ;add address offsetè    MOV    M,A        ;store new screen width
  811.     CALL    JMPMAGIC    ;set SCREEN PAC
  812.     ORA    A
  813.     JRNZ    NO$SCRL        ;80/104 Spalten >> scroll OFF
  814.     MVI    A,YES        ;oder 52 Spalten >> scroll ON
  815. SETSCRL:
  816.     LHLD    JTABL        ;load CBIOS address
  817.     MVI    L,AHSENB    ;add address offset
  818.     MOV    M,A        ;store new scroll flag
  819.     CALL    CRLF
  820.     CALL    SCRSHOW
  821.     CALL    SCSHOW
  822.     JMP    CRLF
  823.  
  824. SCRTBL:    DB    '5','2'+80H
  825.     DW    0000H
  826.     DB    '8','0'+80H
  827.     DW    0003H
  828.     DB    '10','4'+80H
  829.     DW    0001H
  830.     DB    0        ;table terminator 
  831.  
  832. NO$SCRL:
  833.     XRA    A        ;80/104 Spalten    >> scroll OFF
  834.     JR    SETSCRL
  835.  
  836. JMPMAGIC:
  837.     LHLD    JTABL
  838.     MVI    L,00H        ;set CBIOS base to **00H
  839.     LXI    D,MAGIC
  840.     DAD    D        ;set new screen width
  841.     PCHL            ;with special OSBORNE routine 
  842.  
  843. SCRSHOW:
  844.     CALL    ILPRT
  845.     DB    'SCREEN PAC Width ',ESC,')',0
  846.  
  847. ;    CALL    SCRNFLG        ; A = SCREEN PAC flag
  848.                 ;liefert immer 11110000B ??? Fehler ??? 
  849.     LHLD    JTABL        ;load CBIOS address
  850.     MVI    L,PLUGH        ;add address offset
  851.     MOV    A,M        ;load new screen width
  852.     ANI    03H
  853.     CPI    01H
  854.     JRZ    SCR104
  855.     CPI    03H
  856.     JRZ    SCR80
  857.     CALL    ILPRT
  858.     DB    '52',0
  859. SCRJMP:    CALL    ILPRT
  860.     DB    ESC,'( column',CR,LF,0 
  861.     RET
  862.  
  863. SCR104:    CALL    ILPRT
  864.     DB    '104',0
  865.     JR    SCRJMP
  866.  
  867. SCR80:    CALL    ILPRT
  868.     DB    '80',0
  869.     JR    SCRJMP
  870.  
  871. ; end of SSET commandè
  872. ; OUTVEC is pointed ot here to intercept the console output routine.
  873. ; This is done to allow screening out some of ASCII characters (00H-7FH).
  874. ; See MEXPAT11.ASM for further info on OUTVEC.
  875.  
  876. ;DDROP:    JMP    CONVEC        ;no screening out
  877.  
  878. ; routines to read received char,
  879. ; emulate an VT100-Terminal, and convert input IBM-ASCII to 7bit-ASCII
  880. ; (return with char in A)
  881.  
  882. OSIN:    PUSH    H
  883.     PUSH    B
  884. OSIN1:    LHLD    RDCHAR        ;load pointer to next read char
  885.     MOV    C,M        ;read received char
  886.     INR    L        ;HL points to next char
  887.     SHLD    RDCHAR        ;save new pointer to next read char
  888.     DI
  889.     LDA    SVCHAR
  890.     SUB    L
  891.     JRNZ    CHNIN        ;jump if more received chars must be read
  892.     LXI    H,REVCTL
  893.     RES    0,M        ;reset Bit0: RDRF (Receive Data Register Full)
  894. CHNIN:    EI
  895.     MOV    A,C        ;received char in A
  896.     LXI    H,MODIOB    ;HL point to config table
  897.     MOV    B,M        ;B = (MODIOB)
  898.     BIT    0,B        ;test FT flag (File Transmit)
  899.     JNZ    CHN$END1    ;jump if FT is set
  900.     BIT    1,B        ;test VT flag (VT Emulation)
  901.     JRZ    NO$ESC        ;jump if VT is not set
  902.  
  903. ; VT100 control: The following control chars are always typed. 
  904.  
  905.     CPI    20H
  906.     JRC    ESC$J0        ;jump if control chars
  907.     LHLD    VT100$ESC    ;HL = (VT100$ESC)    
  908.     PCHL            ;branch to it
  909.  
  910. ESC$J0:    CPI    FF        ;Form Feed
  911.     JRNZ    ESC$J1
  912.     MVI    A,LF        ;replace with LF
  913.     JMP    ESC$END3
  914.  
  915. ESC$J1:    CPI    VT        ;Vertical Tab
  916.     JRNZ    ESC$J2
  917.     MVI    A,LF        ;replace with LF
  918.     JMP    ESC$END3
  919.  
  920. ESC$J2:    CPI    CAN        ;Cancel
  921.     JRZ    ESC$J3
  922.  
  923.     CPI    SUBST        ;Substitute
  924.     JRNZ    ESC$J4
  925. ESC$J3:    MVI    A,DEL        ;replace with DEL - Error indication -
  926.     JMP    ESC$END2    ;and abort the current escape sequence
  927.  
  928. ESC$J4:    CPI    XON
  929.     JRNZ    ESC$J5
  930.     POP    B
  931.     POP    H
  932.     RET            ;return to MEX
  933.  
  934. ESC$J5:    CPI    XOFF
  935.     JRNZ    ESC$J6
  936.     POP    B
  937.     POP    H
  938.     RET            ;return to MEX
  939.  
  940. ESC$J6:    CPI    ESC
  941.     JRNZ    ESC$END0    ; return with Control Char and continue
  942.                 ; with the escape sequence execution
  943.     XRA    A        ;clear A reg
  944.     LXI    H,ESCAPE1    ;HL = ESCAPE1
  945.     JMP    ESC$END
  946.  
  947. NO$ESC:    LXI    H,MODIOB    ;HL point to MODIOB
  948.     MOV    B,Mè    BIT    2,B        ;test II (IBM Input convert)
  949.     JRZ    DEL$CHR        ;jump if II is not set
  950.     LXI    H,CHR$TABL1    ;HL point to char table
  951.     MOV    B,M        ;set loop counter
  952. LOOP1:    INX    H
  953.     CMP    M        ;if A = M  -> Z=1
  954.     INX    H
  955.     JRZ    LPEND1        ;jump if A = M
  956.     DJNZ    LOOP1        ;loop end ?
  957. DEL$CHR:
  958.     BIT    7,A
  959.     JRZ    CHN$END1    ;jump if char < 127
  960.     MVI    A,DEL        ;replace char with DEL
  961. CHN$END1:
  962.     STA    LAST$CHAR    ;save last received char
  963.     LXI    H,REVCTL
  964.     BIT    0,M        ;test RDRF (Receive Data Register full)
  965.     JRNZ    OSIN2        ;jump if Modem Input Buffer is not empty
  966.     POP    B
  967.     POP    H
  968.     RET            ;return to MEX with char in A
  969.  
  970. LPEND1:    MOV    A,M        ;change IBM char to ASCII
  971.     STA    LAST$CHAR    ;save last received char
  972. ESC$END0:
  973.     LXI    H,REVCTL
  974.     BIT    0,M        ;test RDRF (Receive Data Register full)
  975.     JRNZ    OSIN2        ;jump if Modem Input Buffer is not empty
  976.     POP    B
  977.     POP    H
  978.     RET            ;return to MEX with char in A
  979.  
  980. OSIN2:    PUSH    D
  981.     MOV    E,A
  982.     MVI    C,CONOUT
  983.     CALL    BDOS
  984.     POP    D
  985.     JMP    OSIN1
  986.  
  987. ESC$END1:
  988.     LXI    H,NO$ESC
  989.     SHLD    VT100$ESC    ;(VT100$ESC) = HL
  990.     POP    B
  991.     POP    H
  992.     RET            ;return to MEX with control char in A
  993.  
  994. ESC$END2:
  995.     LXI    H,NO$ESC
  996.     SHLD    VT100$ESC    ;(VT100$ESC) = HL
  997. ESC$END3:
  998.     LXI    H,REVCTL
  999.     BIT    0,M        ;test RDRF (Receive Data Register Full)
  1000.     JRNZ    OSIN3        ;jump if Modem Input Buffer is not empty
  1001.     POP    B
  1002.     POP    H
  1003.     RET            ;return to MEX with control char in A
  1004.  
  1005. OSIN3:    MOV    C,A
  1006.     CALL    BCOUT
  1007.     JMP    OSIN1
  1008.     
  1009. CHR$TABL1:
  1010.     DB    07H        ;table length
  1011.     DB    084H,07BH    ;'ae'
  1012.     DB    094H,07CH    ;'oe'
  1013.     DB    081H,07DH    ;'ue'
  1014.     DB    08EH,05BH    ;'Ae'
  1015.     DB    099H,05CH    ;'Oe'
  1016.     DB    09AH,05DH    ;'Ue'
  1017.     DB    0E1H,07EH    ;'sz'
  1018.  
  1019. CHN$OUTPUT:            
  1020.     PUSH    H
  1021.     PUSH    B        
  1022.     LXI    H,MODIOB    ;HL point to config table
  1023.     MOV    B,M        ;load (MODIOB)
  1024.     BIT    0,B        ;test FT flag (File Transmit)
  1025.     JRNZ    CHN$END2    ;jump if FT is set
  1026.     BIT    1,B        ;test VT flag (VT Emulation)
  1027.     JNZ    VT100$OUT    ;jump if VT flag is set
  1028. CHN$OUT1:
  1029.     LXI    H,MODIOB    ;HL point to MODIOB
  1030.     BIT    3,M        ;test IO flag (IBM Output convert)
  1031.     JRZ    CHN$END2    ;jump if IO flag is not set
  1032.     LXI    H,CHR$TABL1    ;HL point to char table length
  1033.     MOV    B,M        ;set loop counter
  1034.     LXI    H,CHN$OUTPUT    ;HL point to the table end + 1
  1035. LOOP2:    DCX    H
  1036.     CMP    M        ;affect flags: (A)=(M) --> Z=1
  1037.     DCX    H
  1038.     JRZ    LPEND2        ;jump if A = (M)
  1039.     DJNZ    LOOP2        ;loop end ?
  1040. CHN$END2:è    POP    B
  1041.     POP    H
  1042.     JMP    OSOUT        ;send char to the serial port 
  1043.                 ;and return to MEX
  1044. LPEND2:    MOV    A,M        ;change ASCII char to IBM
  1045.     POP    B
  1046.     POP    H
  1047.     JMP    OSOUT        ;send char to the serial port 
  1048.                 ;and return to MEX
  1049.  
  1050. ; VT100 Input Emulation
  1051.  
  1052. ESCAPE1:
  1053.     CPI    ESC        ;ignore the following ESC's
  1054.     JRNZ    ESC$JP
  1055.     XRA    A
  1056.     JMP    ESC$END        ;always (VT100$ESC) = ESCAPE1 
  1057. ESC$JP:    CPI    '['
  1058.     JNZ    ESCX        ;jump if ESC + letter
  1059.     XRA    A        ;clear rg A
  1060.         STA    ROW        ;clear in row & col arrays
  1061.         STA    COL
  1062.     LXI    H,ESCAPE2
  1063.     JMP    ESC$END
  1064.  
  1065. ESCAPE2:
  1066.     CPI    '?'        ;if it is  ESC [ ?  ignore the
  1067.     JZ    SKIP        ;following parameters
  1068.     CPI    40H        ;is this a final letter code ?
  1069.     JC    GETP        ;if not, get parameters
  1070. è;   OTHERWISE, FIGURE OUT WHAT NEEDS TO BE DONE
  1071.  
  1072. UPLOW:    CPI    60H        ;IS IT LOWER CASE?
  1073.     JNC    LOWC
  1074.     CPI    'K'        ;ESC [ K = clear to end of line
  1075.         JRNZ    ESC1
  1076.     MVI    C,ESC
  1077.         CALL    BCOUT
  1078.     MVI    C,'T'
  1079.         CALL    BCOUT        ;type ESC T
  1080.     JMP    ESC$ENDX1
  1081.  
  1082. ESC1:   CPI    'J'
  1083.         JRNZ    ESC2
  1084.     LDA    ROW
  1085.     ANA    A        ;affect flags
  1086.     CPI    02H        ;ESC [ 2 J = clear screen
  1087.     JRNZ    CLREOS1        ;jump if A reg <> 2
  1088.     CALL    CALCUR        ;CUR$CURS = curent cursor position
  1089.     MVI    C,CLRSCR
  1090.         CALL    BCOUT
  1091.     LHLD    CUR$CURS
  1092.     JMP    LCP14        ;restore cursor
  1093.  
  1094. CLREOS1:
  1095.     MVI    C,ESC        ;ESC [ J = clear to end of screen
  1096.     CALL    BCOUT
  1097.     MVI    C,'T'
  1098.     CALL    BCOUT        ;ESC T = clear to end of line
  1099.     CALL    CALCUR        ;CUR$CURS = curent cursor position
  1100.                 ;and load curent cursor position in HL
  1101.     MVI    A,23        ;23+1 lines on screen
  1102.     SUB    H
  1103.     JZ    LCP14        ;jump if cursor in line 23, no insert line
  1104.     PUSH    H
  1105.     MOV    B,A        ;numbers of lines to insert - 1
  1106.     PUSH    B
  1107.     MVI    C,DOWN
  1108.     CALL    BCOUT        ;cursor down
  1109.     POP    B
  1110.     MVI    C,ESC
  1111. ELP1:    PUSH    B
  1112.      CALL    BCOUT 
  1113.     MVI    C,'E'
  1114.     CALL    BCOUT        ;B X ESC E = insert line
  1115.     POP    B
  1116.     DJNZ    ELP1
  1117.     POP    H
  1118.     JMP    LCP14        ;restore cursor
  1119.  
  1120. ESC2:    CPI    'D'        ; ESC [ P1 D = BACKSPACE
  1121.     JRNZ    ESC3
  1122.     CALL    CALCUR        ;curent cursor position in HL
  1123.     LDA    ROW        ;get parameter
  1124.     ANA    A        ;affect flags
  1125.     JRNZ    ELD2
  1126.     MVI    A,01H        ; IF A WAS ZERO, DO ONCE ANYWAY
  1127. ELD2:    MOV    C,A
  1128.     MOV    A,L
  1129.     SUB    C        ;new column in A
  1130.     JRNC    ELP2        ;if column - P1 < 0, send CR
  1131.     MVI    C,CR
  1132.     CALL    BCOUT
  1133.     JMP    ESC$ENDX1
  1134.  
  1135. ELP2:    MOV    L,A        ;new column in L
  1136.     JMP    LCP14è
  1137. ESC3:    CPI    'B'        ; ESC [ P1 B = CURSOR-DOWN
  1138.     JRNZ    ESC4
  1139.     CALL    CALCUR        ;curent cursor position in HL
  1140.     LDA    ROW        ;get parameter
  1141.     ANA    A        ;affect flags
  1142.     JRNZ    ELD3
  1143. ELJ3:    MVI    A,01H        ; IF A WAS ZERO, DO ONCE ANYWAY
  1144. ELD3:    ADD    H        ;new row in A
  1145.     CPI    24        ;row must be < 24
  1146.     JRC    ELQ3
  1147.     MVI    A,23
  1148. ELQ3:    MOV    H,A        ;new row in H
  1149.     JMP    LCP14
  1150.  
  1151. ESC4:    CPI    'F'        ;ESC [ P1 F = previous line
  1152.     JRZ    ELQ4
  1153.     CPI    'A'        ;ESC [ P1 A = CURSOR-UP
  1154.     JNZ    ESC5
  1155. ELQ4:    CALL    CALCUR        ;curent cursor position in HL
  1156.     LDA    ROW        ;get parameter
  1157.     ANA    A        ;affect flags
  1158.     JRNZ    ELD4
  1159. ELJ4:    MVI    A,01H        ; IF A WAS ZERO, DO ONCE ANYWAY
  1160. ELD4:    MOV    C,A
  1161.     MOV    A,H
  1162.     SUB    C        ;new row in A
  1163.     JRNC    ELP4        ;if row - P1 < 0 replace with 0
  1164.     MVI    A,0
  1165. ELP4:    MOV    H,A        ;new row in H
  1166.     JMP    LCP14
  1167.  
  1168. ESC5:    CPI    'C'        ; ESC [ P1 C = cursor right
  1169.     JRNZ    ESC6
  1170.     CALL    CALCUR        ;curent cursor position in HL
  1171.     LDA    ROW        ;get parameter
  1172.     ANA    A        ;affect flags
  1173.     JRNZ    ELD5
  1174.     MVI    A,01H        ; IF A WAS ZERO, DO ONCE ANYWAY
  1175. ELD5:    ADD    L        ;new column in A
  1176.     CPI    80        ;column must be < 80
  1177.     JRC    ELQ5
  1178.     MVI    A,79
  1179. ELQ5:    MOV    L,A        ;new column in H
  1180.     JMP    LCP14
  1181.  
  1182. ESC6:    CPI    'H'        ; ESC [ P1;P2 H, POSTION CURSOR
  1183.     JZ    PUTCUR
  1184.  
  1185. ESC7:    CPI    'L'        ; ESC [ P1 L, INSERT LINE(S)
  1186.     JRNZ    ESC8
  1187.     LDA    ROW        ;get parameter
  1188.     ANA    A        ;affect flags
  1189.     MVI    B,01H
  1190.     JRZ    ELJ7        ; IF A WAS ZERO, DO ONCE ANYWAY
  1191.     MOV    B,A
  1192. ELJ7:    PUSH    B
  1193.     MVI    C,ESC
  1194.     CALL    BCOUTè    MVI    C,'E'
  1195.     CALL    BCOUT
  1196.     MVI    C,ESC
  1197.         CALL    BCOUT
  1198.     MVI    C,'T'
  1199.         CALL    BCOUT
  1200.     POP    B
  1201.     DJNZ    ELJ7        ;type B x ESC E ESC T
  1202.     JMP    ESC$ENDX1
  1203.  
  1204. ESC8:    CPI    'X'        ;ESC [ P1 X = erase char(s)
  1205.      JRZ    ELQ8
  1206.     CPI    'P'        ;ESC [ P1 P = delete char(s)
  1207.     JRNZ    ESC9
  1208. ELQ8:    MVI    C,'W'
  1209.     JMP    PRT$CTL        ;send ESC W = delete char at cursor pos.
  1210.  
  1211. ESC9:    CPI    'M'        ; ESC [ P1 M, DELETE LINE(S)
  1212.     JRNZ    ESC10
  1213.     MVI    C,'R'
  1214.     JMP    PRT$CTL        ;send ESC R = delete line(s)
  1215.  
  1216. ESC10:    CPI    '@'        ; ESC [ P1 @, insert char(s)
  1217.     JRNZ    ESC11
  1218.     MVI    C,'Q'
  1219.     JMP    PRT$CTL        ;send ESC Q = insert char at cursor pos.
  1220.  
  1221. ESC11:    CPI    'E'        ; ESC [ P1 E = next line/new line (CR+LF)
  1222.     JRNZ    ESC12
  1223.     LDA    ROW        ;get parameter
  1224.     ANA    A        ;affect flags
  1225.     MVI    B,01H
  1226.     JRZ    ELP11        ; IF A WAS ZERO, DO ONCE ANYWAY
  1227.     MOV    B,A
  1228. ELP11:    MVI    C,LF
  1229. ELL11:    PUSH    B
  1230.     CALL    BCOUT        ;type LF
  1231.     POP    B
  1232.     DJNZ    ELL11
  1233.     MVI    C,CR
  1234.     CALL    BCOUT        ;type CR
  1235.     JMP    ESC$ENDX1 
  1236.  
  1237. ESC12:    CPI    'G'        ; ESC [ P1 G, horizontal absolute
  1238.     JRNZ    ESC13
  1239.     CALL    CALCUR        ;curent cursor position in HL
  1240.     LDA    ROW        ;get parameter
  1241.     ANA    A        ;affect flags
  1242.     CPI    0
  1243.     JRZ    ELP12
  1244.     DCR    A
  1245.     CPI    80        ;OSBORNE 1 only has 80 column
  1246.     JRC    ELP12
  1247.     MVI    A,79
  1248. ELP12:    MOV    L,A        ;L = column
  1249.     JMP    LCP14
  1250.  
  1251. ESC13:    CPI    'S'        ;ESC [ P1 S = scroll down (one line down)
  1252.     JZ    EXJ6
  1253.  
  1254. ESC14:    CPI    'T'        ;ESC [ P1 T = Scroll Reverse (one line up)
  1255.     JZ    EXJ9
  1256.  
  1257. ESC15:    CPI    'I'        ;ESC [ P1 I = Tabulator
  1258.     JRNZ    ESC16è    LDA    ROW        ;get parameter
  1259.     ANA    A        ;affect flags
  1260.     MVI    B,01H
  1261.     JRZ    ELD15        ; IF A WAS ZERO, DO ONCE ANYWAY
  1262.     MOV    B,A
  1263. ELD15:    MVI    E,TAB
  1264.     MVI    C,CONOUT
  1265. ELP15:    PUSH    B
  1266.     CALL    BDOS
  1267.     POP    B
  1268.     DJNZ    ELP15
  1269.     JMP    ESC$ENDX1
  1270.  
  1271. ESC16:    CPI    'Z'        ;ESC [ P1 Z = backward tabulation
  1272.  
  1273. IF VTDEBUG
  1274.     JRNZ    ESC20
  1275. ENDIF
  1276.  
  1277. IF NOT VTDEBUG
  1278.     JNZ    ESC$ENDX1    ;ignore not selected chars
  1279. ENDIF
  1280.  
  1281.     CALL    CALCUR        ;curent cursor position in HL
  1282.     LDA    ROW        ;get parameter
  1283.     ANA    A        ;affect flags
  1284.     JRNZ    ELD16
  1285.     INR    A        ; IF A WAS ZERO, DO ONCE ANYWAY
  1286. ELD16:    MOV    B,A
  1287.     XRA    A
  1288.     MVI    E,8
  1289.     MOV    C,L        ;curent column in C
  1290. ELP16:    ADD    E
  1291.     CMP    C
  1292.     JRC    ELP16        ;add 8 to A, until A > C
  1293. ELQ16:    SUB    E
  1294.     JRZ    ELJ16        ;send CR, if A = 0
  1295.     DJNZ    ELQ16        ;subtract P1 x 8 = P1 x Backtab
  1296.     MOV    L,A
  1297.     JMP    LCP14        ;set cursor to new postion
  1298.  
  1299. ELJ16:    MVI    C,CR
  1300.         CALL    BCOUT        ;type CR
  1301.     JMP    ESC$ENDX1
  1302.  
  1303. IF VTDEBUG
  1304.  
  1305. ESC20:    LXI    H,ESC$TBL
  1306.     MVI    B,0
  1307.     MOV    C,M        ;load jump counter
  1308.     INX    H        ;HL points to first char
  1309.     CCIR            ;Z80 CPIR
  1310.     JZ    ESC$ENDX1    ;jump if equal char found, ignore char
  1311.     JMP    UNKE        ;not sure what this is
  1312.  
  1313. ESC$TBL:
  1314.     DB    ESC$TBL$E-ESC$TBL-1    ;table length
  1315. ;    DB    'N'        ;ignore ESC [ P1 N = Erase in Field
  1316. ;    DB    'O'        ;ignore ESC [ P1 O = Erase in Area
  1317. ;    DB    'R'        ;ignore ESC [ P1 R = scroll up
  1318.     DB    'U'        ;ignore ESC [ P1 U = next page
  1319.     DB    'V'        ;ignore ESC [ P1 V = preceding page
  1320. ;    DB    'W'        ;ignore ESC [ P1 W = tabulator control
  1321. ;    DB    'Y'        ;ignore ESC [ P1 Y = vertical tabulation
  1322. ESC$TBL$E:
  1323.  
  1324. ENDIFè
  1325. ; LOWER CASE FINAL LETTER CODE
  1326.  
  1327. LOWC:    CPI    'm'        ; ESC [ P1;...;Pn m = graphic code
  1328.     JNZ    LCX10
  1329.     XRA    A
  1330.     STA    PARCT        ;(PARCT) = 0, first parameter
  1331.     LDA    ROW        ;get parameter
  1332.     ANA    A        ;affect flags
  1333.     JRNZ    LCX0        ;ESC [ 0 m = clear all parameters
  1334.     MVI    C,ESC
  1335.         CALL    BCOUT
  1336.     MVI    C,28h
  1337.         CALL    BCOUT        ;ESC,28h = dim off
  1338.     MVI    C,ESC
  1339.         CALL    BCOUT
  1340.     MVI    C,6Dh
  1341.         CALL    BCOUT        ;ESC,6Dh = underline off
  1342.     JR    LCX9
  1343. LCX0:    CPI    01H
  1344.     JRZ    LCX1        ;ESC [ 1 m = high intensity
  1345.     CPI    08H
  1346.     JRNZ    LCX2        ;ESC [ 8 m = low intensity
  1347. LCX1:    MVI    C,ESC
  1348.         CALL    BCOUT
  1349.     MVI    C,29h
  1350.         CALL    BCOUT        ;ESC,28h = dim on
  1351.     JR    LCX9
  1352. LCX2:    CPI    02H
  1353.     JRNZ    LCX3        ;ESC [ 2 m = normal intensity
  1354.     MVI    C,ESC
  1355.         CALL    BCOUT
  1356.     MVI    C,28h
  1357.         CALL    BCOUT        ;ESC,28h = dim off
  1358.     JR    LCX9
  1359. LCX3:    CPI    04H
  1360.     JRZ    LCX4        ;ESC 4 m = underline
  1361.     CPI    05H
  1362.     JRZ    LCX4        ;ESC 5 m = slow blink
  1363.     CPI    06H
  1364.     JRZ    LCX4        ;ESC 6 m = fast blink
  1365.     CPI    07H
  1366.     JRNZ    LCX9        ;ESC 7 m = reverse video    
  1367. LCX4:    MVI    C,ESC
  1368.         CALL    BCOUT
  1369.     MVI    C,6Ch
  1370.         CALL    BCOUT        ;ESC,6Dh = underline on
  1371. LCX9:    LDA    PARCT
  1372.     CPI    01H
  1373.     JZ    ESC$ENDX1    ;only 2 parameters alowed
  1374.     INR    A        ;A = 1
  1375.     STA    PARCT        ;(PARCT) = 1, second parameter
  1376.     LDA    COL        ;get parameter
  1377.     ANA    A        ;affect flags
  1378.     JZ    ESC$ENDX1    ;return if A = 0, no 2. parameter 
  1379.     JMP    LCX0
  1380.  
  1381. LCX10:    CPI    'r'        ; SET SCROLLING REGION
  1382.     JRNZ    LCX11        ; OSBORNE 1 CAN'T HANDLE THIS,
  1383.     MVI    C,HOME        ; BUT NEED TO HOME CURSOR
  1384.         CALL    BCOUT
  1385.     JMP    ESC$ENDX1    ; SINCE VT100 DOES IT
  1386.  
  1387. LCX11:    CPI    'f'è    JZ    PUTCUR        ; HORIZ & VERT POSITION - USE PUTCUR
  1388.  
  1389. LCX12:    CPI    'b'        ; ESC [ P1 b = repeat last character
  1390.     JRNZ    LCX13
  1391.     LDA    ROW        ;get parameter
  1392.     ANA    A        ;affect flags
  1393.     MVI    B,01H
  1394.     JRZ    LCD12        ;if A = 0, do once anyway 
  1395.     MOV    B,A
  1396. LCD12:    LDA    LAST$CHAR
  1397.     MOV    C,A
  1398. LCP12:    PUSH    B
  1399.     CALL    BCOUT
  1400.     POP    B
  1401.     DJNZ    LCP12
  1402.     JMP    ESC$ENDX1
  1403.         
  1404. LCX13:    CPI    's'        ; ESC [ s, save cursor position
  1405.     JRNZ    LCX14
  1406. LCD13:    CALL    CALCUR        ;curent cursor position in HL
  1407.     SHLD    SAVE$CURS
  1408.     JMP    ESC$ENDX1
  1409.  
  1410. LCX14:    CPI    'u'        ; ESC [ u, restore cursor position
  1411.     JRNZ    LCX15
  1412. LCD14:    LHLD    SAVE$CURS
  1413. LCP14:    PUSH    H
  1414.     MVI    C,ESC
  1415.     CALL    BCOUT
  1416.     MVI    C,'='        ;ESC,'=',row+20H,column+20H
  1417.     CALL    BCOUT
  1418.     POP    H
  1419.     MOV    A,H        ;row in A
  1420.     ADI    20H
  1421.     MOV    C,A
  1422.     PUSH    H
  1423.     CALL    BCOUT        ;type row
  1424.     POP    H
  1425.     MOV    A,L        ;column in A
  1426.     ADI    20H
  1427.     MOV    C,A
  1428.         CALL    BCOUT        ;type column
  1429.     JMP    ESC$ENDX1
  1430.  
  1431. LCX15:    CPI    'd'        ;ESC [ P1 d = vertical position absolute
  1432.  
  1433. IF VTDEBUG
  1434.     JRNZ    LCX16
  1435. ENDIF
  1436.  
  1437. IF NOT VTDEBUG
  1438.     JNZ    ESC$ENDX1    ;ignore not selected char
  1439. ENDIF
  1440.  
  1441.     LDA    ROW        ;get parameter
  1442.     ANA    A        ;affect flags
  1443.     LHLD    CURS
  1444.     RES    7,L        ;L = column
  1445.     CPI    0
  1446.     JRZ    LCD15
  1447.     DCR    A
  1448.     CPI    24        ;OSBORNE 1 only has 24 rowsè    JRC    LCD15
  1449.     MVI    A,23
  1450. LCD15:    MOV    H,A        ;H = row
  1451.     JMP    LCP14
  1452.  
  1453. IF VTDEBUG    
  1454.  
  1455. LCX16:    LXI    H,LCX$TBL
  1456.     MVI    B,0
  1457.     MOV    C,M        ;load jump counter
  1458.     INX    H        ;HL points to first char
  1459.     CCIR            ;Z80 CPIR
  1460.     JZ    ESC$ENDX1    ;jump if char equal, ignore char
  1461.     JMP    UNKE        ;not sure what this is
  1462.  
  1463. LCX$TBL:
  1464.     DB    LCX$TBL$E-LCX$TBL-1    ;table length    
  1465.     DB    'a'        ;ignore ESC [ P1 a = horizontal relative 
  1466. ;    DB    'c'        ;ignore DEVICE ATTRIBUTE
  1467.     DB    'e'        ;ignore ESC [ P1 e = vertical position rel
  1468. ;    DB    'g'        ;ignore TAB STOP SET
  1469. ;    DB    'h'        ;ignore SETTING MODE
  1470. ;    DB    'i'        ;ignore PRINT COMMANDS
  1471. ;    DB    'l'        ;ignore RESETTING MODE
  1472. ;    DB    'n'        ;ignore REPORTING
  1473.     DB    'o'        ;ignore ESC [ P1 o = define area qualific
  1474.     DB    'p'        ;ignore ESC [ P1;P2 p = keyboard redefinition
  1475.     DB    'q'        ;ignore KEYBOAD LEDS
  1476.     DB    'y'        ;ignore SELF TESTS
  1477. LCX$TBL$E:
  1478.  
  1479. ENDIF
  1480.  
  1481. ;   ESCAPE SEQUENCE PROCESSING
  1482.  
  1483. ESCX:    CPI    'D'        ;ESC D = Index (IND) -one line down-
  1484.     JRNZ    EX7
  1485. EXJ6:    CALL    CALCUR        ;curent cursor position in HL
  1486.     MOV    A,H        ;A = row
  1487.     CPI    23
  1488.     JNC    EXK6
  1489.     MVI    C,DOWN
  1490.     CALL    BCOUT        ;only cursor down if cursor in row 0-22 
  1491.     JMP    ESC$ENDX1
  1492.  
  1493. EXK6:    PUSH    H
  1494.     MVI    C,HOME
  1495.         CALL    BCOUT
  1496.     MVI    C,ESC
  1497.         CALL    BCOUT
  1498.     MVI    C,'R'
  1499.         CALL    BCOUT        ;delete first line (scroll up)
  1500.     POP    H
  1501.     JMP    LCP14        ;restore cursor in line 23
  1502.  
  1503. EX7:    CPI    'K'        ;ESC K = Partial Line Down
  1504.     JRZ    EXJ6
  1505.  
  1506. EX8:    CPI    'L'        ;ESC L = Partial Line Up
  1507.     JRZ    EXJ9
  1508.  
  1509. EX9:    CPI    'M'        ;ESC M = Reverse Index (RI) -one line up-
  1510.     JRNZ    EX10
  1511. EXJ9:    CALL    CALCUR        ;curent cursor position in HL
  1512.     XRA    A
  1513.     CMP    H        ;row > 0
  1514.     JNC    EXK9
  1515.     MVI    C,UP        ;only cursor up if cursor in row 1-23 
  1516.     CALL    BCOUT
  1517.     JMP    ESC$ENDX1
  1518.  
  1519. EXK9:    PUSH    H
  1520.     MVI    C,HOME
  1521.         CALL    BCOUT
  1522.     MVI    C,ESC
  1523.         CALL    BCOUT
  1524.     MVI    C,'E'
  1525.         CALL    BCOUT        ;delete first line (scroll up)
  1526.     MVI    C,ESC
  1527.         CALL    BCOUT
  1528.     MVI    C,'T'
  1529.         CALL    BCOUT        ;insert line in first row (scroll down)
  1530.     POP    H
  1531.     JMP    LCP14        ;restore cursor in line 0
  1532.  
  1533. EX10:    CPI    'E'        ;ESC E = next line/new line -CR+LF- (NEL)è    JRNZ    EX11
  1534.     MVI    C,CR
  1535.     CALL    BCOUT        ;type CR
  1536.     MVI    C,LF
  1537.     CALL    BCOUT        ;type LF
  1538.     JMP    ESC$ENDX1
  1539.  
  1540. EX11:    CPI    '7'        ;ESC 7 = Save Cursor (DECSC)
  1541.     JZ    LCD13
  1542.  
  1543.     CPI    '8'        ;ESC 8 = Restore Cursor (DECRC)
  1544.     JZ    LCD14
  1545.  
  1546.     CPI    'O'        ;ESC O .. = single shift to char set 3
  1547.     JRNZ    EX12
  1548.     XRA    A
  1549.     LXI    H,ESC$ENDX1    ;DROP NEXT CHARACTER TOO
  1550.     JMP    ESC$END
  1551.  
  1552. EX12:    CPI    '#'        ;ESC # .. = ignore Line Attributes (DEC..)
  1553.     JRNZ    EX13
  1554.     XRA    A
  1555.     LXI    H,ESC$ENDX1    ;DROP NEXT CHARACTER TOO
  1556.     JMP    ESC$END
  1557.  
  1558. EX13:    CPI    '('        ;ESC ( .. = ignore Select Character Set (SCS)
  1559.     JRNZ    EX14
  1560.     XRA    A
  1561.     LXI    H,ESC$ENDX1    ;DROP NEXT CHARACTER TOO
  1562.     JMP    ESC$END
  1563.  
  1564. EX14:    CPI    ')'        ;ESC ) .. = ignore Select Character Set (SCS)
  1565.     JRNZ    EX15
  1566.     XRA    A
  1567.     LXI    H,ESC$ENDX1    ;DROP NEXT CHARACTER TOO
  1568.     JMP    ESC$END
  1569.  
  1570. EX15:    CPI    '='        ;ESC = = put Terminal in Keypad-Transmit mode 
  1571.     JRNZ    EX16
  1572.     LXI    H,MODIOB
  1573.     SETB    4,M        ;set KP flag
  1574.     JMP    ESC$ENDX1    
  1575.  
  1576. EX16:    CPI    '>'        ;ESC > = out of Keypad-Transmit mode
  1577.     JRNZ    EX17
  1578.     LXI    H,MODIOB
  1579.     RES    4,M        ;reset KP flag
  1580.     JMP    ESC$ENDX1
  1581.  
  1582. EX17:    CPI    '?'        ;ignore ESC ? .. .. = mode selection
  1583.     JZ    SKIP
  1584.  
  1585.     CPI    2Fh        ;skip over other intermidiate chars
  1586.     JC    ESC$ENDX2
  1587.  
  1588. IF NOT VTDEBUG 
  1589.     JMP    ESC$ENDX1    ;ignore all not supported chars 
  1590. ENDIF
  1591.  
  1592. IF VTDEBUG
  1593.  
  1594. ; drop all known not supported chars
  1595.  
  1596.     LXI    H,EX$TBL
  1597.     MVI    B,0
  1598.     MOV    C,M        ;load jump counter in BC
  1599.     INX    H        ;HL points to first char
  1600.     CCIR            ;Z80 CPIR
  1601.     JZ    ESC$ENDX1    ;jump if known char found, ignore char
  1602.     PUSH    PSW        ; if received <ESC>, but next char is
  1603.         MVI    C,7FH        ; unknown, send solid block then the
  1604.         CALL    BCOUT        ; original character
  1605.         POP    PSW
  1606.     MOV    C,A    
  1607.     CALL    BCOUT
  1608.     JMP    ESC$ENDX1
  1609.  
  1610. EX$TBL:    DB    EX$TBL$E-EX$TBL-1    ;tabel length
  1611.     DB    '<'        ;ESC < = switch to ANSI mode
  1612. ;    DB    'A'        ;ESC A = 
  1613. ;    DB    'F'        ;ESC F = Start of Selected Area
  1614. ;    DB    'G'        ;ESC G = End of Selected Area
  1615. ;    DB    'H'        ;ESC H = Horizotal Tabulaton Set (HTS)
  1616. ;    DB    'I'        ;ESC I = Hor. Tab with Justificationè;    DB    'J'        ;ESC J = Vertical Tabulation Set
  1617. ;    DB    'N'        ;ESC N = single shift to char set 2
  1618. ;    DB    'P'        ;ESC P = Device Control String
  1619. ;    DB    'Q'        ;ESC Q = ANSI: for Private Use 1
  1620. ;    DB    'R'        ;ESC R = ANSI: for Private Use 2
  1621. ;    DB    'S'        ;ESC S = Set Transmit State
  1622. ;    DB    'T'        ;ESC T = Cancel Character
  1623. ;    DB    'U'        ;ESC U = Request Status Report
  1624. ;    DB    'V'        ;ESC V = Start of Protected Area
  1625. ;    DB    'W'        ;ESC W = End of Protected Area
  1626. ;    DB    'Z'        ;ESC Z = Identify Terminal (DECID)
  1627.     DB    ']'        ;ESC ] = Operating System Control
  1628. ;    DB    '\'        ;ESC \ = String Terminator
  1629.     DB    '^'        ;ESC ^ = Private Message
  1630. ;    DB    '_'        ;ESC _ = Application Program Control
  1631. ;    DB    'a'        ;ESC a = Running Prozess Interrupt
  1632. ;    DB    'c'        ;ESC c = Reset to Initial State (RIS)
  1633. ;    DB    'e'        ;ESC e =
  1634. ;    DB    'r'        ;ESC r = clear screen, restore cursor 
  1635. ;    DB    's'        ;ESC s = 
  1636. EX$TBL$E:
  1637.  
  1638. ENDIF
  1639.  
  1640. SKIP:    LXI    H,SKIP2        ;skip over next parameters
  1641.     JMP    ESC$ENDX2    ;until letter hit, then skip too
  1642.  
  1643. SKIP2:    CPI    40H
  1644.     JC    ESC$ENDX2
  1645.     JMP    ESC$ENDX1
  1646.  
  1647. ; type control sequences, parameter: control char in D
  1648.  
  1649. PRT$CTL:
  1650.     LDA    ROW        ;get parameter
  1651.     ANA    A        ;affect flags
  1652.     MVI    B,1
  1653.     JRZ    PRT$J1        ;if A = 0, do once anyway
  1654.     MOV    B,A
  1655. PRT$J1:    PUSH    B
  1656.     MVI    C,ESC
  1657.     CALL    BCOUT        ;type ESC
  1658.     POP    B
  1659.     PUSH    B
  1660.     CALL    BCOUT        ;type control char in C
  1661.     POP    B
  1662.     DJNZ    PRT$J1
  1663.                 ;fall in ESC$ENDX1
  1664. ESC$ENDX1:
  1665.     LXI    H,NO$ESC
  1666. ESC$ENDX2:
  1667.     XRA    A        ;clear rg A
  1668. ESC$END:
  1669.     SHLD    VT100$ESC    ;(VT100$ESC) = HL
  1670.     LXI    H,REVCTL
  1671.     BIT    0,M        ;test RDRF (Receive Data Register full)
  1672.     JNZ    OSIN1        ;jump if Modem Input Buffer is not empty
  1673.     POP    B
  1674.     POP    H
  1675.     RET            ;return to MEX
  1676.  
  1677. ;VT100 Emulation: convert output chars
  1678.  
  1679. VT100$OUT:è    BIT    6,B        ;test DSF (Direct Send Flag)
  1680.     JNZ    CHN$END2    ;send char to the port directly
  1681.     BIT    7,B        ;test SOC (Send Origial Char Bit)
  1682.     JRZ    VT$OUTJ        ;jump if SOC is not set
  1683.     RES    7,M
  1684.     JMP    CHN$END2    
  1685. VT$OUTJ:
  1686.     BIT    5,B        ;test PFK (PF-Key Flag set)
  1687.     JRZ    VT$OUT3        ;jump if PFK is not set
  1688.     RES    5,M        ;reset PFK
  1689.  
  1690. ; make VT100 PF-Key sequence (ESC,O,..)
  1691.  
  1692. PFK1:    LXI    H,KEYMSG    ;HL points to <ESC>,O,0 string
  1693.     CPI    UP
  1694.     JRNZ    PFK2
  1695.     CALL    ESC$SEND
  1696.     MVI    A,'P'        ;send ESC O P to the port (PFK1)
  1697.     JMP    CHN$END2
  1698.  
  1699. PFK2:    CPI    DOWN
  1700.     JRNZ    PFK3
  1701.     CALL    ESC$SEND
  1702.     MVI    A,'Q'        ;send ESC O Q to the port (PFK2)
  1703.     JMP    CHN$END2
  1704.  
  1705. PFK3:    CPI    BS
  1706.     JRNZ    PFK4
  1707.     CALL    ESC$SEND
  1708.     MVI    A,'R'        ;send ESC O R to the port (PFK3)
  1709.     JMP    CHN$END2
  1710.  
  1711. PFK4:    CPI    RIGHT
  1712.     JNZ    VT$OUT0
  1713.     CALL    ESC$SEND
  1714.     MVI    A,'S'        ;send ESC O S to the port (PFK4)
  1715.     JMP    CHN$END2
  1716.  
  1717. ; make VT100 Cursor sequence (ESC,[,..)
  1718.  
  1719. VT$OUT3:
  1720.     LXI    H,ESCMSG    ;HL points to VT100 escape sequence
  1721.     CPI    BS
  1722.     JRNZ    VT$OUT4
  1723.     CALL    ESC$SEND
  1724.     MVI    A,'D'        ;send ESC [ D to the port
  1725.     JMP    CHN$END2
  1726.  
  1727. VT$OUT4:
  1728.     CPI    DOWN
  1729.     JRNZ    VT$OUT5
  1730.     CALL    ESC$SEND
  1731.     MVI    A,'B'        ;send ESC [ B to the port
  1732.     JMP    CHN$END2
  1733.  
  1734. VT$OUT5:
  1735.     CPI    UP
  1736.     JRNZ    VT$OUT6
  1737.     CALL    ESC$SEND
  1738.     MVI    A,'A'        ;send ESC [ A to the port 
  1739.     JMP    CHN$END2
  1740.  
  1741. VT$OUT6:
  1742.     CPI    RIGHT
  1743.     JRNZ    VT$OUT7        ;no cursor keys, return to convert routine
  1744.     CALL    ESC$SENDè    MVI    A,'C'        ;send ESC [ C to the port
  1745.     JMP    CHN$END2
  1746.  
  1747. ; test if PF-Key init char is typed (RS = 1Eh = ^^)
  1748.  
  1749. VT$OUT7:
  1750.     LXI    H,MODIOB
  1751.     CPI    RS
  1752.     JRNZ    KEYPD
  1753.     SETB    5,M        ;set PFK (PF-Key Flag)
  1754.     POP    B
  1755.     POP    H
  1756.     RET            ;return to MEX
  1757.  
  1758. ; make Keypad sequence (ESC,O,char+40h)
  1759.  
  1760. ; convert    CR    0D to    4D
  1761. ;        ','    2C to    6C
  1762. ;        '-'    2D to    2D
  1763. ;        '.'    2E to    6E
  1764. ;        '0'    30 to    70
  1765. ;         .
  1766. ;        '9'    39 to    79
  1767.  
  1768. KEYPD:    BIT    4,M        ;test KP flag (Keypad mode active)
  1769.     JRZ    VT$OUT0        ;jump if no Keypad-Mode
  1770.     CPI    CR
  1771.     JRZ    KEYPD1        ;convert CR
  1772.     CPI    ','
  1773.     JC    VT$OUT0        ;jump if char < 2Ch
  1774.     CPI    '/'
  1775.     JRC    KEYPD1        ;convert ',', '-' and '.'
  1776.     JZ    CHN$OUT1    ;return with '/' to output convert routine
  1777.     CPI    ':'
  1778.     JNC    CHN$OUT1    ;return with chars > 3Ah to output convert
  1779.                 ;routine 
  1780. KEYPD1:    PUSH    PSW        ;push typed char
  1781.     LXI    H,KEYMSG
  1782.     CALL    ESC$SEND    ;send ESC O to the port
  1783.     POP    PSW
  1784.     ADI    40H
  1785.     JMP    CHN$END2    ;send last typed char+40H to the port
  1786.  
  1787. ; test if SOC (Send Original Char Bit) init char (US) is typed
  1788. ; used to send the original chars (typed US,^L sequence sends ^L)
  1789.  
  1790. VT$OUT0:
  1791.     CPI    US        ;Unit Separator
  1792.     JRNZ    VT$OUT1
  1793.     SETB    7,M        ;set SOC Bit of MODIOB
  1794.     POP    B
  1795.     POP    H
  1796.     RET            ;return to MEX
  1797.  
  1798. ; convert control char or return
  1799.  
  1800. VT$OUT1:
  1801.     CPI    GS        ;Group Separator    
  1802.     JRNZ    VT$OUT2
  1803.     MVI    A,BS
  1804.     JMP    CHN$END2    ;convert <GS> to <BS>
  1805.  
  1806. VT$OUT2:
  1807.     CPI    FS        ;File Separator
  1808.     JNZ    CHN$OUT1    ;send typed char, return to convert routine
  1809.     MVI    A,VT
  1810.     JMP    CHN$END2    ;convert <FS> to <VT> = ^K
  1811.                 ;^K is needed for Editors with WordStar Keys
  1812.                 ;OSBORNE's Cursor Up Key (^K) is converted
  1813.                 ;to the VT100 Sequence ESC [ A -see VT$OUT5-
  1814. OVR1:    EQU    $
  1815.     IF OVR1 / 0D00H
  1816.     +++ overlay area 1 too large +++
  1817.     ENDIF
  1818.  
  1819. ; MEX-overlay area:   0100H - 0CFF for patches !!!
  1820.  
  1821. ╗ 0D00╚ ║ start of MEX V1.14 config-table  (see MEXPAT22.ASM)
  1822.  
  1823.     ORG    0D07H
  1824. MEMRY:    DW    OVREND        ;first free memory pointer (orginal: 6098H)
  1825.           
  1826. ;    ORG    0D0DH        ;OUTVEC MEX-console output vec.
  1827. ;OUTVEC:    DW    DDROP
  1828.  
  1829.     ORG    0D1FH
  1830. ESCCHR:    DB    ESC        ;terminal mode escape char
  1831.  
  1832.     ORG    0D34H
  1833. INIMEX:    DB    YES        ;YES=runs INI.MEX (if present) at startup
  1834.  
  1835.     ORG    0D39H
  1836. SILENT:    DB    NO        ;NO=silence multi-line & READ cmd echo
  1837.  
  1838. ; Following is the GLOBAL secondary table.
  1839. ; To set an option to global, change its ASCII character to a 0H.
  1840.  
  1841.     ORG    0D3EH
  1842. RESTT:    DB    'ABDE',0,'LQRS',0,'VX'
  1843.     DS    7
  1844. QUEUE:    DB    1        ;1=allow queueing, 0=no
  1845. TIMBAS:    DW    208        ;Timing constant
  1846. MODE:    DB    0        ;mode of modem I/O
  1847. SMINIT:    DS    2        ;Smartmodem INIT routine adrs
  1848. SSETV:    DW    SSET        ;SSETV MEX-SSET-Vector
  1849. SMEXIT:    DS    2        ;Smartmodem EXIT routine adrs
  1850.  
  1851.        ORG    3B0AH
  1852. JMP$PARITY:
  1853.     DW    SET$PARITV    ;jump to new routine
  1854.  
  1855.  
  1856. ; MEX V1.14 ends with 6097H. To give additional space these area is
  1857. ; protected with setting MEMRY: to OVREND pointer. 
  1858.  
  1859.  
  1860.     ORG    6098H
  1861.  
  1862. ; Overlay Data II
  1863.  
  1864. MSPEED1:    DS    1    ;aktueller MSPEED-Wert
  1865. VT100$ESC:    DW    NO$ESC    ;input convert pointer
  1866. LAST$CHAR:    DB    0    ;last received char
  1867. PARCT:      DB    0    ;parameter counts
  1868.  
  1869. ROW:        DB    0    ;Cursor Row pos, or other param.
  1870. COL:        DB    0    ;Cursor Column pos., or 2rd param.
  1871. CUR$CURS:    DB    0,0    ;curent cursor position
  1872. SAVE$CURS:    DB    0,0    ;saved cursor position
  1873.                 ;(SAVE$CURS) = column position
  1874.                 ;(SAVE$CURS+1) = row position
  1875. ESCMSG:    DB    ESC,'[',0    ;VT100 ESC init sequence
  1876. KEYMSG:    DB    ESC,'O',0    ;VT100 KEY init sequence
  1877.  
  1878. ; HAYES Modem dial routine data area
  1879.  
  1880. SMDIAL:    DB    'ATDTW '    ;W=Wait for Dial Tone            
  1881. DIALBF:    DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  1882. DIALPT:    DS    2        ;DIAL POSITION POINTER
  1883.  
  1884. ; Serial port Interrupt save area
  1885.  
  1886.     ORG    60FBh
  1887. REVCTL:    DB    00001100b    ;Receive Control Byte
  1888.                 ;Bit 0 = RDRF (Receive Data Register Full)
  1889.                 ;Bit 1 = 0
  1890.                 ;Bit 2 = /DCD (Data Carrier Detect)
  1891.                 ;Bit 3 = /CTS (Clear to Send)
  1892.                 ;Bit 4 = FE   (Framing Error)
  1893.                 ;Bit 5 = OVRN (Receiver Overrun)
  1894.                 ;Bit 6 = PE   (Parity Error)
  1895.                 ;Bit 7 =
  1896. SVCHAR:    DW    SAVEFD        ;address of the next save char
  1897. RDCHAR:    DW    SAVEFD        ;address of the last read char
  1898. SAVEFD:    DS    100h        ;Save field with 255 chars
  1899.                 ;it must beginn with a new page (..00h) ! 
  1900.  
  1901. ; HAYES Modem control words
  1902.  
  1903. SMATN:    DB    '+++',0
  1904. SMDISC:    DB    'ATH',CR,0
  1905. SMRES:    DB    'ATZ',CR,0    ;reset modem
  1906. SMDP1:    DB    'AT&P1',CR,0    ;set Dial Pulse Ratio to 33/66
  1907.  
  1908. ; some help routines
  1909.  
  1910. ; for Modem Input - Output
  1911.  
  1912. ; Die Umsetzung von IBM-Umlauten fuehrt zu Fehlern, wenn die Konvertierungs-
  1913. ; routine vor einem Filetransfer (S-Kommando) nicht abgeschaltet wird.
  1914. ; Die hierfuer verwendete Sprungadresse PARITV: wird nur bei den SB, RB,
  1915. ; und R ordnungsgemaess angesprungen.
  1916. ; Die SET$PARITV: Routine ist in den S-Filetransfer eingefuegt, und schaltet
  1917. ; mit PARITV: die Konvertierungstabelle ab.
  1918. ; Die folgende Routine ist im MEX-Original bei ... eingebaut:
  1919.  
  1920. ;  ..
  1921. ; 3B06    CALL    3B0D
  1922. ; 3B09    JMP    NC,4F09        <-- JETZT: SET$PARITV    
  1923. ; 3B0C    RET
  1924. ;  ..
  1925.  
  1926. SET$PARITV:
  1927.     CALL    PARITV
  1928.     JMP    SEND$VEC    ; SEND$VEC:     EQU    4F09
  1929.  
  1930. ; disable char converting and VT100 emulation
  1931.  
  1932. TBL$ON:    LXI    H,MODIOB    ;HL point to MODIOB
  1933.     RES    0,M
  1934.     CALL    ILPRT
  1935.     DB    ESC,28H,BELL,0
  1936.     RET
  1937.  
  1938. ; enable char converting and VT100 emulation
  1939.  
  1940. TBL$OFF:
  1941.     LXI    H,MODIOB    ;HL point to MODIOB
  1942.     SETB    0,M
  1943.     CALL    ILPRT
  1944.     DB    ESC,29H,0 
  1945.     RET
  1946.  
  1947. ; for SET - SSET functions
  1948.  
  1949. ; Compare next input-stream item in table @DE; CY=1
  1950. ; if not found, else HL=matched data itemè
  1951. TSRCH:    MVI    C,LOOKUP    ;get function code
  1952.     JMP    MEX        ;pass to MEX processor
  1953.  
  1954. ; for general use
  1955.  
  1956. ; Print in-line message ... blows away C register
  1957.  
  1958. ILPRT:    MVI    C,ILP        ;get function code
  1959.     JMP    MEX        ;go do it
  1960.  
  1961. ; Newline on console
  1962.  
  1963. CRLF:    MVI    A,CR
  1964.     CALL    TYPE
  1965.     MVI    A,LF        ;fall into TYPE
  1966.  
  1967. ; type char in A on console
  1968.  
  1969. TYPE:    PUSH    H
  1970.     PUSH    D
  1971.     PUSH    B
  1972.     MOV    E,A        ;align output character
  1973.     MVI    C,CONOUT    ;print via MEX
  1974.     CALL    MEX
  1975.     POP    B
  1976.     POP    D
  1977.     POP    H
  1978.     RET
  1979.  
  1980. ; Direct Consol Output - char in C    
  1981.  
  1982. BCOUT:    LHLD    JTABL
  1983.     MVI    L,0Ch        ;CBIOS Consol Output routine offset
  1984.     PCHL            ;branch to it
  1985.  
  1986. ; for VT100 Emulation
  1987.  
  1988. ;get Parameters & save them
  1989.  
  1990. GETP:    CPI    31H        ;skip over chars < 30H (0)
  1991.                 ;or suppress leading zeros
  1992.     JC    ESC$ENDX2
  1993.     CPI    ';'        ; CHECK IF FIRST PARAMETER = 0
  1994.     JZ    GETCOL
  1995.     ANI    0FH        ;strip upper bits
  1996.     STA    ROW        ;store ones digit
  1997.     XRA    A
  1998.     LXI    H,GETP1
  1999.     JMP    ESC$END        ; GET NEXT PARAMETER
  2000.  
  2001. GETP1:    CPI    40H        ; IF NONE, GO TO LETTER DETECT
  2002.     JNC    UPLOW
  2003.     CPI    30H        ;skip over chars < 30H (0)
  2004.     JC    ESC$ENDX2
  2005.     CPI    ';'        ; ONLY ONE DIGIT?
  2006.     JRZ    GETCOL
  2007.     LXI     H,ROW        ;HL = ROW
  2008.     ANI    0FH        ;strip bits 4-7
  2009.     MOV    C,A        ;move A to C, now once place
  2010.     MOV    A,M        ;move (ROW) to A,now tens place
  2011.     RLC            ;multiply by two
  2012.     MOV    B,A        ;store 2X in B
  2013.     RLC            ; 4X
  2014.     RLC            ; 8X
  2015.     ADD    B        ; 2X + 8X = 10X
  2016.     MOV    B,A        ;set aside in B reg.
  2017.     MOV    A,C        ;& get ones digit
  2018.     ADD    B        ;Result in in A reg.
  2019.     MOV    M,A        ;now, save parameter
  2020.     XRA    A
  2021.     LXI    H,GETP2
  2022.     JMP    ESC$END        ; GET NEXT PARAMETER
  2023.  
  2024. GETP2:    CPI    40H        ; IF NONE, GO TO LETTER DETECT
  2025.     JNC    UPLOW
  2026.     CPI    30H        ;skip over chars < 30H (0)è    JC    ESC$ENDX2
  2027.     CPI    ';'        ; IF THREE DIGITS, SKIP IT
  2028.     JNZ    SKIP        ; NOT SURE WHAT TO DO
  2029.  
  2030. GETCOL:    XRA    A
  2031.     LXI    H,GETCOL1
  2032.     JMP    ESC$END        ; GET NEXT PARAMETER, SKIP OVER ';'
  2033.  
  2034. GETCOL1:
  2035.     CPI    40H        ; IF NO COL, GO TO LETTER DETECT
  2036.     JNC    UPLOW
  2037.     CPI    31H        ;skip over chars < 30H (0)
  2038.                 ;or suppress leading zeros
  2039.     JC    ESC$ENDX2
  2040.     ANI    0FH        ;strip upper bits
  2041.     STA    COL        ;store ones digit
  2042.     XRA    A
  2043.     LXI    H,GETCOL2
  2044.     JMP    ESC$END        ; GET NEXT PARAMETER
  2045.  
  2046. GETCOL2:
  2047.     CPI    40H        ; IF NONE, GO TO LETTER DETECT
  2048.     JNC    UPLOW
  2049.     CPI    30H        ;skip over chars < 30H (0)
  2050.     JC    ESC$ENDX2
  2051.     LXI     H,COL        ;HL = COL
  2052.     ANI    0FH        ;strip bits 4-7
  2053.     MOV    C,A        ;move A to C, now once place
  2054.     MOV    A,M        ;move (COL) to A,now tens place
  2055.     RLC            ;multiply by two
  2056.     MOV    B,A        ;store 2X in B
  2057.     RLC            ; 4X
  2058.     RLC            ; 8X
  2059.     ADD    B        ; 2X + 8X = 10X
  2060.     MOV    B,A        ;set aside in B reg.
  2061.     MOV    A,C        ;& get ones digit
  2062.     ADD    B        ;Result in in A reg.
  2063.     MOV    M,A        ;now, save parameter
  2064. GETNXT:    XRA    A
  2065.     LXI    H,GETNXT1
  2066.     JMP    ESC$END        ; GET THIRD PARAMETER (IGNORED)
  2067.  
  2068. GETNXT1:
  2069.     CPI    40H        ; IF NONE, GO TO LETTER DETECT
  2070.     JNC    UPLOW
  2071.     JR    GETNXT        ; OTHERWISE, LOOP UNTIL WE FIND ONE
  2072.  
  2073. ; Calculate curent cursor position
  2074.  
  2075. CALCUR:    LHLD    CURS        ; load curent cursor position
  2076.                 ;    H          L    
  2077.                 ; -------- --------
  2078.                 ; 1111RRRR RCCCCCCC  R=row, C=column
  2079.     MOV    A,H
  2080.     ANI    0FH        ;strip out bits 4-7
  2081.     ORA    A        ;clear C-flag
  2082.     RALR    L        ;bit 7 in C-flag, bit 0 = 0
  2083.     RAL            ;now bit 7 from L in bit 0
  2084.     RRCR    L        ;L = 0CCCCCCC    C=column
  2085.     MOV    H,A        ;H = 000RRRRR    R=row
  2086.     SHLD    CUR$CURS    ;store curent cursor position in CUR$CURS
  2087.     RET
  2088.  
  2089. ; Direct cursur addressing
  2090.  
  2091. PUTCUR:    MVI    C,ESC        ;all required chars received.
  2092.     CALL    BCOUT        ;now create OSBORNE 1 equivalent
  2093.     MVI    C,'='        ;ESC = row column 
  2094.     CALL    BCOUT
  2095.     LDA    ROW        ;get parameter
  2096.     ADI    20H        ;OSBORNE 1 CODES START AT 20H
  2097.     CPI    20H        ;OSBORNE 1 ROWS=0-23, VT100=1-24
  2098.     JRZ    PUTROW
  2099.     DCR    A
  2100.     CPI    38H        ; OSBORNE 1 ONLY HAS 24 ROWS
  2101.     JRC    PUTROW        ;jump if row < 23
  2102.     MVI    A,37H
  2103. PUTROW:    MOV    C,A
  2104.     CALL    BCOUT
  2105.     LDA    COL        ;get parameter
  2106.     ADI    20H        ; OSBORNE 1 CODES START AT 20H
  2107.     CPI    20H        ; DECREMENT UNLESS AT ZERO
  2108.     JRZ    PUTCOL
  2109.     DCR    A
  2110.     CPI    70H        ; LIMIT COLS TO 80
  2111.     JRC    PUTCOL
  2112.     MVI    A,6FH
  2113. PUTCOL:    MOV    C,A
  2114.     CALL    BCOUT        ;type column
  2115.     JMP    ESC$ENDX1
  2116.  
  2117. ; send an ESC sequence to modem
  2118.  
  2119. ESC$SEND:
  2120.     LDA    MODIOB        ;load Modem Input - Output Byte
  2121.     PUSH    PSW
  2122.     SETB    6,A        ;set DSF => skip over output convert routines
  2123.     STA    MODIOB
  2124.     CALL    SMSEND
  2125.     POP    PSW
  2126.     RES    6,A        ;reset DSF
  2127.     STA    MODIOB
  2128.     RET
  2129.  
  2130. ; print unknown control sequence
  2131.  
  2132. UNKE:    PUSH    PSW        ;IF RECEIVED <ESC [>, BUT NEXT
  2133.         MVI    C,7FH        ;   3 CHARACTERS UNRECOGNIZABLE,è        CALL    BCOUT        ;   SEND A SOLID BLOCK, A "[",
  2134.         MVI    C,'['        ;   AND THEN THE PARAMETER
  2135.         CALL    BCOUT        ;   CHARACTERS IN HEX.
  2136.         LDA    ROW
  2137.         CALL    BYTHXA
  2138.     MOV    C,L
  2139.     PUSH    B
  2140.         MOV    C,H
  2141.         CALL    BCOUT
  2142.     POP    B
  2143.         CALL    BCOUT
  2144.     MVI    C,';'
  2145.     CALL    BCOUT
  2146.     LDA    COL
  2147.         CALL    BYTHXA
  2148.     MOV    C,L
  2149.     PUSH    B
  2150.         MOV    C,H
  2151.         CALL    BCOUT
  2152.     POP    B
  2153.         CALL    BCOUT
  2154.         POP    PSW
  2155.     MOV    C,A
  2156.     CALL    BCOUT
  2157.     JMP    ESC$ENDX1
  2158.  
  2159. ; *** BYTE-to-HEX-ASCII routine ***
  2160. ; converts char in A rg to hex chars in HL rg
  2161.  
  2162. BYTHXA:    PUSH    PSW
  2163.      RRC
  2164.     RRC
  2165.     RRC
  2166.     RRC
  2167.     CALL    NIBHX1
  2168.     MOV    H,A
  2169.     POP    PSW
  2170.     PUSH    PSW
  2171.     CALL    NIBHX1
  2172.     MOV    L,A
  2173.     POP    PSW
  2174.     RET
  2175.  
  2176. ; *** NIBBLE-to-HEX-ASCII routine ***
  2177.  
  2178. NIBHX1:    ANI    0FH
  2179.     ADI    90H
  2180.     DAA
  2181.         ACI    40Hè    DAA
  2182.         RET
  2183.  
  2184. ; serial port baud rate setting 
  2185.  
  2186. NEWBD:    LXI    H,MSPEED1    ;NEWBD entry
  2187.     CMP    M
  2188.     JRZ    STBD3        ;jmp if bps not changed
  2189.     CALL    NEWBD1
  2190.     JC    SETERR        ;not-supported baud code
  2191.     LDA    MODCTB
  2192.     ANI    RTSBIT
  2193.     JNZ    BDSWT        ;IF RS232 on -> print Switch-Msg.
  2194. STBD3:    CALL    BDSHOW
  2195. STBD2:    CALL    ILPRT
  2196.     DB    CR,LF,'++ Tel.: ',0
  2197.     RET
  2198.  
  2199. NEWBD1:                ;startup and set baud entry
  2200.     LXI     H,MSPEED1    ;lade HL-Register 
  2201.     CMP    M        ;? Wert von MSPEED mit Wert von MSPEED1
  2202.     RZ            ;vergleichen, wenn gleich -> zurueck    
  2203.     CPI    1        ; ? MSPEED=1
  2204.     JRZ    OK300
  2205.     CPI    5        ; ? MSPEED=5
  2206.     JRZ    OK1200
  2207.     CPI    6        ; ? MSPEED=6
  2208.     JRZ    OK2400
  2209.     XRA    A        ;entry error
  2210.     STC            ;cy = 1
  2211.     RET
  2212.  
  2213. OK2400:    CALL    ST2400
  2214.     JMP    STBAUD
  2215.  
  2216. OK300:    CALL    ST2400
  2217.     CALL    ST300
  2218.     CALL    PAUSE        ;Pause
  2219.     JMP    STBAUD
  2220.  
  2221. OK1200:    CALL    ST2400
  2222.     CALL    ST300
  2223.     LDA    MODCTB        ;last 6850 control byte
  2224.     ANI    NOT BAUDMSK    ;clear out baud bits
  2225.     ORI    BAUD12        ;put new baud bits in
  2226.     STA    MODCTB        ;set new bps
  2227.     CALL    OSET        ;set O-1 to 1200 bps
  2228.     CALL    PAUSE        ;pause    
  2229.  
  2230. STBAUD: CALL    MODP1        ;Impuls-Pausen-Verhaeltnis einstellen
  2231.     LDA    MSPEED        ;load MSPEED 
  2232.     RET
  2233.  
  2234. ST2400:    STA    MSPEED1        ;aktuellen MSPEED-Wert setzen
  2235.     STA    MSPEED        ;MSPEED auf 2400 bps setzen
  2236.     LDA    MODCTB        ;last 6850 control byte
  2237.     ANI    NOT BAUDMSK    ;clear out baud bits
  2238.     ORI    BAUD12        ;put new baud bits in
  2239.     STA    MODCTB        ;set new bps
  2240.     CALL    OSET        ;st O-1 to 1200 bps
  2241.     CALL    MDRES        ;1.Modemreset + Pause
  2242.     JMP    MDRES        ;2.Modemreset > 2400 bps Hardwareschalter è
  2243. ST300:    LDA    MODCTB        ;last 6850 control byte
  2244.     ANI    NOT BAUDMSK    ;clear out baud bits
  2245.     ORI    BAUD3        ;put new baud bits in
  2246.     STA    MODCTB        ;aktuellen BAUD-Wert setzen
  2247.     CALL    OSET        ;O-I auf 300 bps setzen
  2248.                 ;fall in Modemreset + Pause
  2249.  
  2250. MDRES:    LXI    H,SMRES        ;Modemreset
  2251.     CALL    SMSEND
  2252.                 ;fall in PAUSE
  2253. PAUSE:    MVI    B,15        ;1.5 sec warten
  2254.     MVI    C,TIMER
  2255.     JMP    MEX
  2256.  
  2257. MODP1:    LXI    H,SMDP1        ;AT&P1-Befehl
  2258.     CALL    SMSEND
  2259.     JMP    PAUSE        ;Pause
  2260.  
  2261. BDSWT:    CALL    BDSWITCH
  2262.     CALL    BDSHOW 
  2263.  
  2264. IF SWTASK
  2265.     CALL    ILPRT
  2266.     DB    'and press <RET> ',0
  2267.     MVI    C,IN$OUT
  2268.     MVI    E,0FFH
  2269. WAITIN:    CALL    MEX
  2270.     ORA    A
  2271.     JRZ    WAITIN        ;waiting for input
  2272. ENDIF
  2273.  
  2274.     JMP    STBD2
  2275.  
  2276. BDSWITCH:
  2277.     CALL    ILPRT
  2278.     DB    '++ Set RS232 to ',0
  2279.     RET
  2280.  
  2281. ; Smartmodem utility routine: send string to modem
  2282.  
  2283. SMSEND:    MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  2284.     CALL    MEX
  2285.     JRNZ    SMSEND
  2286.     MOV    A,M        ;FETCH NEXT CHARACTER
  2287.     INX    H
  2288.     ORA    A        ;END?
  2289.     RZ            ;DONE IF SO
  2290.     MOV    B,A        ;NO, POSITION FOR SENDING
  2291.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  2292.     CALL    MEX
  2293.     JR    SMSEND
  2294.  
  2295. ; The DIAL routine is free to use any of the registers, but must return
  2296. ; the above code after an end-dial sequence
  2297.  
  2298. DIAL:    LHLD    DIALPT        ;FETCH POINTER
  2299.     CPI    254        ;START DIAL?
  2300.     JRZ    STDIAL        ;JUMP IF SO
  2301.     CPI    255        ;END DIAL?
  2302.     JRZ    ENDIAL        ;JUMP IF SO
  2303.  
  2304. ; Not start or end sequence, must be a digit to be sent to the modem
  2305.  
  2306.     MOV    M,A        ;PUT CHAR IN BUFFER
  2307.     INX    H        ;ADVANCE POINTER
  2308.     SHLD    DIALPT        ;STUFF PNTR
  2309.     RET            ;ALL DONE
  2310.  
  2311. ; Here on a start-dial sequence
  2312.  
  2313. STDIAL:    LXI    H,DIALBF    ;SET UP BUFFER POINTER
  2314.     SHLD    DIALPT
  2315.     RET
  2316.  
  2317. ; Here on an end-dial sequence
  2318.  
  2319. ENDIAL:    MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  2320.     INX    H        ;FOLLOWED BY TERMINATOR
  2321.     MVI    M,0
  2322.     LDA    TOUCHPULSE    ;GET OVERLAY'S TOUCH-TONE FLAG
  2323.     STA    SMDIAL+3    ;PUT INTO STRING
  2324.     LXI    H,SMDIAL    ;POINT TO DIALING STRING
  2325.     CALL    SMSEND        ;SEND IT
  2326. WAITSM:    MVI    C,INMDM
  2327.     CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  2328.     JRNC    WAITSM        ;LOOP UNTIL NO MORE CHARACTERS
  2329.  
  2330. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  2331. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).è; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE
  2332. ; FOR A CARRIER ON THE OTHER END.  YOU CAN CHANGE BY PLAYING WITH THE
  2333. ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND
  2334. ; WAIT TO 20 SECONDS).
  2335.  
  2336. RESULT:    MVI    C,60        ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  2337. SMWLP:    PUSH    B
  2338.     MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  2339.     MVI    C,TMDINP    ;DO TIMED INPUT
  2340.     CALL    MEX
  2341.     POP    B
  2342.     JRNC    SMTEST        ;JUMP IF MODEM HAD A CHAR
  2343.     PUSH    B
  2344.     MVI    C,CHEKCC
  2345.     CALL    MEX        ;test for ^C from console
  2346.     JRZ    CTL$C        ;jump if ^C is typed
  2347.     POP    B
  2348.     DCR    C        ;no
  2349.     JRNZ    SMWLP        ;continue
  2350.     MVI    A,2        ;return abort code (no connection)
  2351.     RET
  2352.  
  2353. CTL$C:    MVI    B,CR
  2354.     MVI    C,SNDCHR
  2355.     CALL    MEX        ;shut down the modem
  2356.     MVI    A,3        ;return abort code
  2357.     POP    B
  2358.     RET
  2359.  
  2360. ; MODEM GAVE US A RESULT, CHECK IT
  2361.  
  2362. SMTEST:    ANI    7FH        ;IGNORE ANY PARITY
  2363.     CALL    SMANAL        ;TEST THERESULT
  2364.     MOV    A,B        ;A=RESULT (CY SIGNIFICANT HERE TOO)
  2365.     PUSH    PSW        ;SAVE IT
  2366. SMTLP:    MVI    C,INMDM        ;FLUSH ANY REMAINING COMMAND LINE
  2367.     CALL    MEX
  2368.     JRC    SMCHEK        ;JUMP IF NO INPUT
  2369.     CPI    LF        ;GOT SOME ... WAITING FOR EOL
  2370.     JRNZ    SMTLP        ;EAT ANY IN-BETWEEN
  2371. SMCHEK:    POP    PSW        ;A HAS MEX RETURN-CODE, CY=1 IF UNKNOWN
  2372.     JC    RESULT        ;IF RESULT UNKNOWN, IGNORE IT
  2373.     RET
  2374.  
  2375. SMANAL:    MVI    B,0        ;PREP CONNECT CODE
  2376.     CPI    'C'        ;"CONNECT"?
  2377.     RZ
  2378. IF     NUMRES
  2379.     CPI    '1'        ;NUMERIC VERSION OF "CONNECT+CONNECT 2400(10)"
  2380.     RZ
  2381.     CPI    '5'        ;NUMERIC VERSION OF "CONNECT 1200"
  2382.     RZ
  2383.     CPI    '9'        ;NUMERIC VERSION OF "CONNECT 600"     
  2384.     RZ
  2385. ENDIF
  2386.     INR    B        ;PREP BUSY CODE B=1
  2387.     CPI    'B'
  2388.     RZ
  2389. IF    NUMRES
  2390.     CPI    '7'        ;NUMERIC VERSION OF "BUSY"        
  2391.     RZ
  2392. ENDIFè    INR    B        ;PREP NO CONNECT MSG B=2
  2393.     CPI    'N'        ;N=NO CONNECT
  2394.     RZ            ;(NO CARRIER,NO DIALTONE,NO ANSWER)
  2395. IF     NUMRES
  2396.     CPI    '3'        ;NUMERIC VERSION OF "NO CARRIER"
  2397.     RZ
  2398.     CPI    '6'        ;NUMERIC VERSION OF "NO DIALTONE"    
  2399.     RZ            ;                    
  2400.     CPI    '8'        ;NUMERIC VERSION OF "NO ANSWER"        
  2401.     RZ
  2402. ENDIF
  2403.     MVI    B,4        ;PREP MODEM ERROR
  2404.     CPI    'E'        ;E=ERROR
  2405.     RZ
  2406. IF    NUMRES
  2407.     CPI    '4'        ;NUMERIC VERSION OF "ERROR"
  2408.     RZ
  2409. ENDIF
  2410.     STC            ;UNKNOWN...
  2411.     RET
  2412.  
  2413. ; Sends a 300 msec break.  Will work only with the modem connector. 
  2414.  
  2415. SENDBRK:
  2416.     LDA    MODCTB
  2417.     ANI    RTSBIT
  2418.     JRNZ    BRKERR        ;no break on RS232
  2419.     PUSH    H
  2420.     LDA    MODCTB        ;turn on break
  2421.     ORI    BRKBIT
  2422.     CALL    OSET
  2423.     MVI    B,3        ;wait for 300 ms
  2424.     MVI    C,TIMER
  2425.     CALL    MEX
  2426.     LDA    MODCTB        ;turn off break 
  2427.     CALL    OSET
  2428.     POP    H
  2429.     RET
  2430.  
  2431. BRKERR: LXI    D,BRKEMS    ;print error
  2432.     MVI    C,PRINT
  2433.     JMP    MEX
  2434.  
  2435. ;  Drops RTS for 3 sec.  RTS is not available on the RS232 connector. 
  2436.  
  2437. DISCON:    XRA    A
  2438.     ORI    DSCDTR
  2439.     JZ    DISCON1        ;disconnect with ATH
  2440.     LDA    MODCTB
  2441.     ANI    RTSBIT
  2442.     JNZ    DISCON1        ;no DTR ON->OFF on RS232
  2443.     PUSH    H
  2444.     LDA    MODCTB        ;drop RTS
  2445.     ORI    RTSBIT
  2446.     CALL    OSET
  2447.     MVI    B,30        ;wait for 3 sec
  2448.     MVI    C,TIMER
  2449.     CALL    MEX
  2450.     LDA    MODCTB        ;restore RTS
  2451.     CALL    OSET
  2452.     POP    H
  2453.     RETè
  2454. ; FOLLOWING ROUTINE DISCONNECTS THE MODEM USING SMARTMODEM
  2455. ; CODES. ALL REGISTERS ARE AVAILABLE FOR THIS FUNCTION.
  2456. ; NOTHING RETURNED TO CALLER.
  2457.  
  2458. DISCON1:
  2459.     PUSH    H
  2460.     MVI    B,20
  2461.     MVI    C,TIMER        ;WAIT 2 SECONDS
  2462.     CALL    MEX
  2463.     LXI    H,SMATN        ;SEND '+++'
  2464.     CALL    SMSEND
  2465.     MVI    B,20        ;WAIT 2 MORE SECONDS
  2466.     MVI    C,TIMER
  2467.     CALL    MEX
  2468.     LXI    H,SMDISC    ;SEND 'ATH'
  2469.     CALL    SMSEND
  2470.     MVI    B,1        ;WAIT 1 SECOND
  2471.     MVI    C,TIMER
  2472.     CALL    MEX
  2473.     POP    H
  2474.     RET
  2475.  
  2476. ; Return data carrier detect (DCD) status
  2477. ;    0   = no carrier
  2478. ;    255 = carrier present
  2479. ;    254 = we don't know (DCD not supported)
  2480.  
  2481. DCDVEC:    MVI    A,254        ; Return 'we don't know'
  2482.     RET
  2483.  
  2484. ; SSET PEEK    display memory location in hex and ascii
  2485.  
  2486. IF SETPEEK    
  2487. PEEK:    CALL    CRLF
  2488.     MVI    C,EVALA
  2489.     CALL    MEX        ;get numeric
  2490.     PUSH    H
  2491.     MVI    B,16        ;will do 16 bytes
  2492. PKLP1:    MOV    A,M        ;get byte
  2493.     MOV    C,A
  2494.     RAR            ;swap nibbles
  2495.     RAR
  2496.     RAR
  2497.     RAR
  2498.     CALL    HEX1        ;put out first nibble
  2499.     MOV    A,C
  2500.     CALL    HEX1        ;put out second nibble
  2501.     MVI    A,' '
  2502.     CALL    TYPE
  2503.     INX    H
  2504.     DCR    B
  2505.     JRNZ    PKLP1        ;keep doing it
  2506.     CALL    CRLFè    POP    H        ;point to starting byte again
  2507.     MVI    B,16
  2508. PKLP2:    MVI    A,' '
  2509.     CALL    TYPE
  2510.     MOV    A,M
  2511.     CPI    20H
  2512.     JRC    NOTASC        ;must be control
  2513.     CPI    7FH
  2514.     JRNC    NOTASC        ;del and above
  2515.     CALL    TYPE        ;put out printable
  2516.     JMP    ASC
  2517. NOTASC:    MVI    A,'.'        ;put out a '.' for non-printable
  2518.     CALL    TYPE
  2519. ASC:    MVI    A,' '
  2520.     CALL    TYPE
  2521.     INX    H
  2522.     DCR    B
  2523.     JRNZ    PKLP2        ;keep doing it
  2524.     CALL    CRLF
  2525.     JMP    CRLF
  2526.  
  2527. HEX1:    ANI    0FH        ;zero top nibble
  2528.     ADI    90H        ;thanks to
  2529.     DAA            ;  Kelly Smith
  2530.     ACI    40H        ;    for this strange
  2531.     DAA            ;      looking code
  2532.     CALL    TYPE
  2533.     RET
  2534. ENDIF
  2535.  
  2536. SOMESG:    DB    CR,LF
  2537.     DB    'OSBORNE 1 overlay V',REV/10+'0','.',REV MOD 10+'0',CR,LF
  2538.     DB    '  (C) 90 Kl. Schauer',CR,LF
  2539.     DB    'Type (',ESC,')S',ESC,'()',ESC,')SET ?',ESC,'( for help',CR,LF
  2540.     DB    LF,'$'
  2541. èSETEMS:    DB    CR,LF,'++ Entry Error ++',CR,LF
  2542.     DB    'Type (',ESC,')S',ESC,'()',ESC,')SET ?',ESC,'( for help',CR,LF
  2543.     DB    LF,BELL,'$'
  2544.  
  2545. BRKEMS:    DB    CR,LF,ESC,')++ no BREAK on RS232 ++',ESC,'(',CR,LF
  2546.     DB    LF,BELL,'$'
  2547.  
  2548. HLPMSG1:
  2549.     DB    CLRSCR,'SET Options',CR,LF
  2550.     DB    LF
  2551.     DB    ESC,')SET BAUD',ESC,'(  <',ESC,')300',ESC,'(> <'
  2552.     DB    ESC,')1200',ESC,'(> <',ESC,')2400',ESC,'(>',CR,LF
  2553.     DB    LF
  2554.     DB    ESC,')SET BITS',ESC,'(  <',ESC,')7E2',ESC,'(> <',ESC,')7O2'
  2555.     DB    ESC,'(> <',ESC,')7E1',ESC,'(> <',ESC,')7O1',ESC,'(>',CR,LF
  2556.     DB    '          <',ESC,')8N2',ESC,'(> <',ESC,')8N1',ESC,'(> <'
  2557.     DB    ESC,')8E1',ESC,'(> <',ESC,')8O1',ESC,'(>',CR,LF
  2558.     DB    '    NOTE: <8E1> <8O1> only with <300> BAUD',CR,LF
  2559.     DB    LF
  2560.     DB    ESC,')SET IN',ESC,'(',CR,LF
  2561.     DB    ESC,')SET OUT',ESC,'(',TAB,'...toggle Chars',CR,LF
  2562.     DB    LF
  2563.     DB    ESC,')SET VT100',ESC,'(',TAB,'...toggle VT100 emulation',CR,LF
  2564.     DB    LF
  2565.     DB    ESC,')SET DIAL',ESC,'(',TAB,'...toggle Dial Mode',CR,LF
  2566.     DB    LF,'$'
  2567.  
  2568. HLPMSG:    DB    CLRSCR,'SSET Options',CR,LF
  2569.     DB    LF
  2570.     DB    ESC,')SSET PORT',ESC,'(',TAB
  2571.     DB    '   ...toggle Serial Ports',CR,LF
  2572.     DB    LF
  2573.     DB    ESC,')SSET WIDTH',ESC,'( <',ESC,')nnn',ESC,'(>'
  2574.     DB    ' ...set Screen Width',CR,LF
  2575.     DB    LF
  2576.     DB    ESC,')SSET SCREEN ',ESC,'(<',ESC,')52',ESC,'(> <',ESC,')80',ESC,'(> <'
  2577.     DB    ESC,')104',ESC,'(> ...set SCREEN-PAC',CR,LF
  2578.     DB    LF
  2579.     DB    ESC,')SSET SCROLL',ESC,'(',TAB,'   ...toggle Auto Scroll',CR,LF
  2580.     DB    LF
  2581.     DB    ESC,')SSET ARROW',ESC,'(',TAB
  2582.     DB    '   ...toggle Arrow Keys',CR,LF
  2583.     DB    LF,'$'
  2584.  
  2585. ; Osborne Serial Port Input/Output routines
  2586.  
  2587. ; Stuff the control register on the 6850
  2588.  
  2589. OSET:    MOV    C,A
  2590. OSET1:    LHLD    JTABL        ;load BIOS+3, C=MODCTB
  2591.     MVI    L,3CH        ;special OSBORNE 1 routine (SBAUD: E13C)
  2592.     PCHL            ;branch to it & return to MEX if finished
  2593. è; routines must be at a memory location above 4000h !!!
  2594.  
  2595. OSOUT:    DI            ;DISABLE INTERRUPTS
  2596.     OUT    0        ;SWITDH TO ALTERNATE PAGE
  2597.     STA    MODDATP        ;SEND DATA BYTE
  2598.     OUT    1        ;SWITCH PAGES BACK
  2599.     EI            ;RE-ENABLE INTERRUPTS
  2600.     RET            ;return to MEX
  2601.  
  2602. OSTAT:    DI            ;DISABLE INTERRUPTS
  2603.     PUSH    B
  2604.     OUT    0        ;SWITCH TO ALTERNATE PAGE
  2605.     LDA    MODCTLP        ;GET STATUS BYTE
  2606.     OUT    1        ;SWITCH PAGES BACK
  2607.     ANI    00000010b    ;select TDRE (Transmit Data Register Empty)
  2608.     MOV    B,A
  2609.     LDA    REVCTL        ;load Receive Control Bits
  2610.     ORA    B        ;put TDRE in
  2611.     POP    B
  2612.     EI            ;RE-ENABLE INTERRUPTS
  2613.     RET            ;return to MEX
  2614.  
  2615. ;Serial port interrupt routine
  2616. ;incomming char saved to print them later
  2617.  
  2618. SERINT:    DI
  2619.     SSPD    IESTK        ;save interrupted process stack
  2620.     LXI    SP,ISTK        ;load interrupt stack address
  2621.     PUSH    PSW
  2622.     PUSH    B
  2623.     PUSH    H
  2624.     LXI    H,MODCTLP
  2625.     OUT    0
  2626.     MOV    A,M        ;get Status Byte
  2627.     ANI    01111101b    ;clear TDRE (Transmit Data Register Empty)
  2628.                 ;and /IRQ (Interrupt Request) out
  2629.     STA    REVCTL        ;store Receive Control Bits
  2630.  
  2631. ;    BIT    2,A        ;bit 2: /DCD (Data Carrier Detected)
  2632.                 ;used as RTS (CTS) on RS-232 interface
  2633. ;    JRZ    INTJ1        ;jump if RTS is ON
  2634. ;    LDA    MODCTB        ;load Modem Control Byte
  2635. ;    MOV    B,A
  2636. ;    ORI    RESET        ;ACIA Master Reset
  2637. ;    OUT    0
  2638. ;    MOV    M,A        ;force Master Reset
  2639. ;    MOV    M,B        ;set control byte
  2640. ;    OUT    1
  2641. ;    JMP    INTRET
  2642.     
  2643. INTJ1:    INX    H        ;HL points to MODDATP
  2644.     MOV    A,M        ;get received char
  2645.     LHLD    SVCHAR        ;read save address pointer
  2646.     MOV    M,A        ;store received char
  2647.     INR    L        ;HL points to next save address
  2648.     SHLD    SVCHAR        ;save new address pointer
  2649. INTRET:    LDA    ROMRAM        ;load ROM/RAM flag
  2650.     MOV    C,A
  2651.     OUTP    A        ;return to ROM or RAM
  2652.     POP    H
  2653.     POP    B
  2654.     POP    PSW
  2655.     LSPD    IESTK        ;load interrupted stack address
  2656.     EI
  2657.     RET
  2658.  
  2659. ; Return ring indicator status
  2660. ;    0   = not ringing
  2661. ;    255 = ring detected
  2662. ;    254 = we don't know (RI not supported)
  2663.  
  2664. RNGVEC:    DI            ;DISABLE INTERRUPTS
  2665.     OUT    0        ;SWITCH TO ALTERNATE PAGE
  2666.     LDA    VICTLA        ;get Video Control Byte A (Bit 6: RI flag)
  2667.     OUT    1        ;SWITCH PAGES BACK
  2668.     BIT    6,A
  2669.     MVI    A,255        ; RING detected
  2670.     JRNZ    RNGV1        ;jump if RI detected, return with A = 255
  2671.     XRA    A        ;A = 0
  2672. RNGV1:    EI            ;RE-ENABLE INTERRUPTS
  2673.     RET
  2674.  
  2675. ;get Screen-Pac flag
  2676.  
  2677. SCRNFLG:
  2678.     DI            ;DISABLE INTERRUPTS
  2679.     OUT    0        ;SWITCH TO ALTERNATE PAGE
  2680.     LDA    SCRNPAC        ;GET SCREEN-PAC FLAG
  2681.     OUT    1        ;SWITCH PAGES BACK
  2682.     EI            ;RE-ENABLE INTERRUPTS
  2683.     RET
  2684.  
  2685. OVREND:    END
  2686.