;
;                         MCOSB797.ASM
;
;       Patches for overlaying distribution version of MODEM797,
;               for use with the Osborne O-1.
;
;You will want to look this file over carefully, there are a number
;of options that you can use to configure MODEM797 to suit your taste.
;
;
;       TO USE: First edit this file filling in answers for your own
;               equipment.  Then assemble with ASM.COM or equivalent
;               assembler.  Then use DDT to overlay the the results
;               of this program to the original MODEM797.COM file:
;
;               A>DDT MODEM797.COM
;               DDT VERS 2.2
;               NEXT  PC
;               4080 0100
;               -IMCOSB797.HEX          (note the "I" command)
;               -R                      (loads in the .HEX file)
;               NEXT  PC
;               4080 0000
;               -G0                     (return to CP/M)
;               A>SAVE 64 MODEM797.COM  (now have modified .COM file)
;
;
;12/17/82 - Revised for MODEM796                                PLK
;
;12/01/82 - The file is left in the 11/29/82 form as an example of
;           memory mapped I/O. Osborne owners may want to use the
;           approach Frank Wancho describes.                    PLK
;
;11/30/82 - This file stills uses an old-style and now obsolete form of
;           accessing the RS232 port directly thru the bank-switching
;           technique with code in memory above 4000H, all OSBORNEs
;           should have now been upgraded to at least ROM 1.2, if not
;           1.3 - the latest version. Combined with that upgrade is a
;           new BIOS that supports the IOBYTE. All that has to be done
;           is toggle the first of the two CON: bits in the IOBYTE
;           as follows:
;
;               0 - keyboard + crt (TTY:)
;               1 - serial port (CRT:)
;                                                               F. J. Wancho
;
;11/29/82 - Version of MODEM797 overlay file for Osborne-1. The
;           Osborne routines come from an earlier version.      P. L. Kelley
;
TRUE    EQU     0FFH
FALSE   EQU     0
;
BELL    EQU     07H     ;bell
CR      EQU     0DH     ;carriage return
LF      EQU     0AH     ;linefeed
;
MODCTLP EQU     2A00H           ;status register for RS232
MODSNDB EQU     2               ;bit to test for ready to send
MODSNDR EQU     MODSNDB         ;change to 0 if bit is 0 when
                               ;ready to send
MODRCVB EQU     1               ;bit to test for received data
MODRCVR EQU     MODRCVB         ;change to 0 if bit is 0 when
                               ;data received
MODDATP EQU     MODCTLP+1       ;data resister for RS232
;
CLR1    EQU     0               ;there is no O-1 clear to end
CLR2    EQU     0               ;of screen sequence
CLR3    EQU     0               ;so all bytes MUST be 0
CLR4    EQU     0
;
SCLR1   EQU     'Z'-40H         ;ctrl-Z for O-1 clear screen
SCLR2   EQU     0               ;and home cursor
SCLR3   EQU     0               ;the unused bytes MUST be 0
SCLR4   EQU     0
;
;
;You can change locations 107H to 120H to suit your taste.
;
;*** WARNING - DO NOT INSERT OR DELETE LINES BEFORE SYSVERMSG: ***
;      THE DEFINED LOCATIONS ARE GIVEN ON THE RIGHT MARGIN.
;
;
               ORG     100H
;
               DS      3       ;(for  JMP  START)
PMMIBYTE:       DB      FALSE   ;don't change this line                 103H
SETUPTST:       DB      TRUE    ;don't change this line                 104H
SCRNTEST:       DB      TRUE    ;don't change this line                 105H
CLOCK:          DB      2       ;don't change this line                 106H
BAKUPBYTE:      DB      FALSE   ;true=make .BAK file                    107H
CKSUMDFLT:      DB      FALSE   ;true=default to Checksum checking      108H
                               ;false=default to CRC checking
TOGGLECRC:      DB      TRUE    ;true=allow toggling of Checksum to CRC 109H
CONVBKSP:       DB      FALSE   ;true=convert backspace to rub          10AH
TOGGLEBK:       DB      TRUE    ;true=allow toggling of bksp to rub     10BH
ADDLF:          DB      FALSE   ;true=add LF after CR                   10CH
TOGGLELF:       DB      TRUE    ;true=allow toggling of LF after CR     10DH
TRANLOGON:      DB      FALSE   ;true=allow transmission of logon       10EH
                               ;write logon sequence at location LOGON
SAVCCP:         DB      FALSE   ;true=do not overwrite CCP              10FH
LOCONEXTCHR:    DB      FALSE   ;true=local command if EXTCHR precedes  110H
                               ;false=not local command if EXTCHR precedes
TOGGLELOC:      DB      TRUE    ;true=allow toggling of LOCONEXTCHR     111H
LSTTST:         DB      TRUE    ;true=allow toggling of printer on/off  112H
                               ;in terminal mode, set to false if your
                               ;printer can't keep up with the modem
XOFFTST:        DB      FALSE   ;true=allow testing of XOFF from remote 113H
                               ;while transmitting a file in terminal mode
XONWAIT:        DB      FALSE   ;true=wait for XON after sending CR     114H
                               ;while transmitting a file in terminal mode
TOGXOFF:        DB      TRUE    ;true=allow toggling of XOFF testing    115H
MSPEED:         DB      1       ;0=110 1=300 2=450 3=600 4=710 5=1200   116H
                               ;default modem speed, PMMI routines
                               ;reset this value and so should your own
                               ;modem routines
BYTDLY:         DB      0       ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec  117H
                               ;default time to send character in
                               ;terminal mode file transfer
CRDLY:          DB      0       ;0=0 delay, 1=0.08 sec, -- ,9=0.72 sec  118H
                               ;default time for extra wait after CR
                               ;in terminal mode file transfer
BELRPT:         DB      30      ;bell repeat time = value*0.03 sec      119H
EXITCHR:        DB      'E'-40H ; ^E = Exit without disconnect          11AH
LOGCHR:         DB      'O'-40H ; ^O = Send logon                       11BH
LSTCHR:         DB      'P'-40H ; ^P = Toggle printer                   11CH
UNSAVE:         DB      'R'-40H ; ^R = Close input text buffer          11DH
TRANCHR:        DB      'T'-40H ; ^T = Transmit file to remote          11EH
SAVECHR:        DB      'Y'-40H ; ^Y = Open input text buffer           11FH
EXTCHR:         DB      'W'-40H ; ^W = Send next character              120H
               DS      6       ;don't change, used only by PMMI        121H
IN$MODCTLP:     JMP     MXSTAT          ;test for status                127H
OUT$MODDATP:    JMP     MXOUT           ;output data to modem           12AH
IN$MODDATP:     JMP     MXIN            ;get data from modem            12DH
ANI$MODSNDB:    ANI     MODSNDB ! RET   ;bit to test for send ready     130H
CPI$MODSNDR:    CPI     MODSNDR ! RET   ;value of send bit when ready   133H
ANI$MODRCVB:    ANI     MODRCVB ! RET   ;bit to test for receive ready  136H
CPI$MODRCVR:    CPI     MODRCVR ! RET   ;value of rcv. bit when ready   139H
               DS      15              ;PMMI only calls                13CH
LOGONPTR:       DW      LOGON           ;                               14BH
JMP$INITMOD:    JMP     MXINIT          ;go to user written routine     14DH
JMP$SETUPR:     JMP     MXSETBAUD       ;                               150H
;
CLREOS:         CALL    JMP$ILPRT       ;                               153H
               DB      CLR1,CLR2,CLR3,CLR4,0
               RET
;
CLRSCRN:        CALL    JMP$ILPRT       ;                               15CH
               DB      SCLR1,SCLR2,SCLR3,SCLR4,0
               RET
;
JMP$ILPRT:      DS      3       ;                                       165H
JMP$ILCOMP:     DS      3       ;                                       168H
JMP$INBUFF:     DS      3       ;                                       16BH
JMP$SYSVER:     JMP     SYSVERMSG;                                      16EH
JMP$DIALPL:     DS      3       ;                                       171H
JMP$DISCONNT:   DS      3       ;                                       174H
;
SYSVERMSG:                      ;                                       16EH
       CALL    JMP$ILPRT
       DB      'Version for: OSBORNE O-1',CR,LF,0
       RET

;INSERT YOUR LOGON HERE, MUST END IN 0.
LOGON:  DB      0
;
MXIN:   CALL    $-$     ;patched to call input routine
       RET
;
MXOUT:  CALL    $-$     ;patched to call output routine
       RET
;
MXSTAT:
       CALL    $-$     ;patched to call status routine
       RET
;
MXINIT:
       LDA     FINITFLG
       ORA     A
       RZ
       CMA
       STA     FINITFLG
       LHLD    6       ;find top of user RAM
       LXI     D,-100H ;step down a little
       DAD     D
       PUSH    H       ;save it
       LXI     D,BDJ   ;point to source of code
       LXI     B,CDLEN+2       ;set length of code
       XCHG
       DB      0EDH,0B0H ; Z80 LDIR
;
       LHLD    6       ;get BDOS address back
       POP     D
       PUSH    D
       INX     D       ;point to address position
       XCHG
       MOV     M,E     ;patch in address
       INX     H
       MOV     M,D
;
       POP     H
       SHLD    6       ;transfer BDOS jump
;
       LXI     D,OSIN-BDJ
       DAD     D       ;compute address of OSIN routine
       SHLD    MXIN+1  ;patch call
       LXI     D,OSOUT-OSIN
       DAD     D
       SHLD    MXOUT+1 ;patch call
       LXI     D,OSTAT-OSOUT
       DAD     D
       SHLD    MXSTAT+1
;
       MVI     A,1             ;MSPEED 300 baud value
       STA     MSPEED
       MVI     C,56H           ;for 300 baud
STBAUD: PUSH    H
       CALL    OSET
       POP     H
       XRA     A       ;clear carry
       RET
;
OSET:   LHLD    1       ;get BIOS+3 address
       MVI     L,3CH   ;special Osborne routine
       PCHL            ;branch to it
;
MXSETBAUD:
       PUSH    H
AGAIN:  LXI     D,BAUDBUF       ;point to input buffer for ILCOMP
       CALL    JMP$ILPRT
       DB      'Input Baud Rate (300, 1200): ',0
       CALL    JMP$INBUFF
       LXI     D,BAUDBUF+2
       CALL    JMP$ILCOMP      ;compare BAUDBUF+2 with characters below
       DB      '300',0
       MVI     A,1             ;MSPEED 300 baud
       MVI     C,56H           ;O-1 300 baud
       JNC     OK              ;go if got match
       CALL    JMP$ILCOMP
       DB      '1200',0
       MVI     A,5
       MVI     C,55H
       JNC     OK
       CALL    JMP$ILPRT       ;all matches failed - tell operator
       DB      '++ Incorrect entry ++',CR,LF,BELL,0
       JMP     AGAIN           ;try again
;
OK:     STA     MSPEED          ;set MSPEED
       POP     H
       JMP     STBAUD
;
BAUDBUF:        DB      10,0
               DS      10
;
FINITFLG:       DB      TRUE
;
;
; --- ROUTINES THAT GET COPIED UP TO TOP OF MEMORY ---
;               JUST UNDER THE BDOS
;
BDJ:    JMP     $-$     ;this gets patched to jump to BDOS entry
;
OSIN:   DI              ;disable interrupts
       OUT     0       ;switch to alternate page
       LDA     MODDATP ;get data byte
       OUT     1       ;switch back pages
       EI              ;re-enable interrupts
       RET
;
OSOUT:  DI              ;disable interrupts
       OUT     0       ;switch to alternate page
       STA     MODDATP ;send data byte
       OUT     1       ;switch back pages
       EI              ;re-enable interrupts
       RET
;
OSTAT:  DI              ;disable interrupts
       OUT     0       ;switch to alternate page
       LDA     MODCTLP ;get status byte
       OUT     1       ;switch back pages
       EI              ;re-enable interrupts
       RET
CDLEN:  EQU     $-BDJ   ;length of code to copy
;
;
       END
;