Mercurial > hg > Members > kono > nitros9-code
changeset 614:998bba700c40
Added source
author | boisy |
---|---|
date | Tue, 26 Nov 2002 19:43:38 +0000 |
parents | 16dc49e3a104 |
children | 9c923ba45566 |
files | 3rdparty/utils/supercomm/defsfile 3rdparty/utils/supercomm/makefile 3rdparty/utils/supercomm/supercomm.asm |
diffstat | 3 files changed, 6938 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/utils/supercomm/defsfile Tue Nov 26 19:43:38 2002 +0000 @@ -0,0 +1,4 @@ +Level equ 2 + use os9defs + use scfdefs + use systype
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/utils/supercomm/makefile Tue Nov 26 19:43:38 2002 +0000 @@ -0,0 +1,18 @@ +include ../../../Makefile.rules + +DEPENDS = ./Makefile + +CMDS = supercomm + +ALLOBJS = $(CMDS) + +all: $(ALLOBJS) $(DEPENDS) + @$(ECHO) "*********************************************" + @$(ECHO) "* *" + @$(ECHO) "* Dave Phillipsen's Supercomm *" + @$(ECHO) "* *" + @$(ECHO) "*********************************************" + +clean: + $(RM) $(ALLOBJS) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/utils/supercomm/supercomm.asm Tue Nov 26 19:43:38 2002 +0000 @@ -0,0 +1,6916 @@ +******************************************************************** +* SuperComm - OS-9 Level Two Communications Program +* +* $Id$ +* +* Ed. Comments Who YY/MM/DD +* ------------------------------------------------------------------ +* Acquired source 02/11/20 + + nam SuperComm + ttl OS-9 Level Two Communications Program + + ifp1 + use defsfile + endc + +rev set $01 + + mod eom,name,Prgrm+Objct,ReEnt+rev,start,DSize + +name fcs /SuperComm/ +Edition fcb $01 + +************************************************* +* +* Supercomm Data Area Layout +* +* Separated from Main source for easier editing +* + + org 0 +Temp rmb 2 Temp var for whatever +u0000 rmb 2 pointer to parameters from shell +u0002 rmb 2 Ptr to max. address of receive buffer (constant) +u0004 rmb 2 Ptr to start address of receive buffer (constant) +u0006 rmb 2 Ptr to current end of receive buffer +u0C82 rmb 1 Search/Reply string # being processed +u0C88 rmb 1 MSB of size of converted output text buffer +u0C89 rmb 1 LSB of size of converted output text buffer +u0008 rmb 1 +u0009 rmb 2 +u000B rmb 1 +u000C rmb 1 +u000D rmb 2 +u000F rmb 2 +u0011 rmb 1 Copy of IT.DLO (Delete line 0=BSE, 1=CRLF) +u0012 rmb 1 Copy of IT.EKO (0=echo off, 1=echo on) +u0013 rmb 2 Ptr to device descriptor +u0015 rmb 2 Ptr to start of SuperComm +u0017 rmb 2 Size of SuperComm +u0019 rmb 1 special version flag (adds 'a' to version #) +u001A rmb 1 +u001B rmb 1 +u001C rmb 1 +u001D rmb 1 +u001E rmb 2 +u0020 rmb 1 +u0021 rmb 1 +u0022 rmb 1 +u0023 rmb 1 sending ASCII file xfer flag (1=Send ASCII) +u0024 rmb 1 +u0025 rmb 1 Flag that ASCII receive file exists +u0026 rmb 1 ASCII receive buffer open +u0027 rmb 2 +u0029 rmb 1 +u002A rmb 1 path # to recieve buffer file +u002B rmb 1 path # to serial port +u002C rmb 1 path # to file for ASCII send +u002D rmb 10 Terminal port to open (up to 10 chars) +u0037 rmb 2 +u0039 rmb 3 +u003C rmb 1 +u003D rmb 1 Path # for disk file +u003E rmb 1 path to status line window +u003F rmb 1 path to conference window (if enabled) +u0040 rmb 1 conference mode activated flag (1=Conference mode) +u0041 rmb 1 key sense data +u0042 rmb 1 path to download file +u0043 rmb 1 +u0044 rmb 1 1 byte bffr for block responses (ACK/NAK,XON/XOFF) +u0045 rmb 1 +u0046 rmb 1 flag for YModem batch +u0047 rmb 1 possible remove (not referenced anywhere) +u0048 rmb 1 \ (u0048 is also running checksum byte) +u0049 rmb 1 / running CRC for file Xfers +u004A rmb 1 last selected xfer protocol (Upload/Send) +u004B rmb 1 last selected xfer protocol (Download/Receive) +u004C rmb 1 +u004D rmb 2 used as a byte counter in download +u004F rmb 1 Internal Error # on xfer +u0050 rmb 2 Ptr to end of X/Ymodem buffer in modem recv bffr +u0052 rmb 1 Current attempt # on CheckSum receive (max=10) +u0053 rmb 2 Current block # (only LSB is used in blck hdrs) +u0055 rmb 2 True block size (includes blk/comp # & crc/chksm) +u0057 rmb 2 # data bytes needed for block (128 or 1024) +u0059 rmb 1 Current attempt # on CRC receive (max=4) +u005A rmb 1 CRC or Checksum (0=Checksum) +u005B rmb 4 4 byte longint (for file sizes) +u005F rmb 1 +u0060 rmb 2 Part of timer routine for download timeouts??? +u0062 rmb 2 +u0064 rmb 1 +u0065 rmb 1 +u0066 rmb 2 Ptr to next key in Conf mode keyboard buffer +u0068 rmb 1 Counter of # keys in Conf mode keyboard buffer +u0069 rmb 1 +u006A rmb 1 +u006B rmb 1 ZModem flag (hi bit clear=none in progress) +u006C rmb 2 pointer to ZModem start header +u006E rmb 1 duplicate of input path for ZModem (for restore) +u006F rmb 1 possible remove +u0070 rmb 1 +u0071 rmb 1 +u0072 rmb 1 path to VRN (0=No VRN present) +u0073 rmb 1 Current seconds counter (either VRN or Clock) +u0074 rmb 1 # seconds on last update done (either VRN or Clock +u0075 rmb 1 Timer on/off flag (0=Off) +u0076 rmb 1 child process # (shell, sz & rz etc...) +u0077 rmb 11 time On-Line ASCII text (with CurXY) '00:00:00' +u0082 rmb 1 Width of original screen +u0083 rmb 1 Height of original screen +u0084 rmb 1 Type of original screen (ex. 1=40x24 Hware txt) +u0085 rmb 1 background color for overlay windows +u0086 rmb 1 +u0087 rmb 1 FColor of main window +u0088 rmb 1 BColor of main window +u0089 rmb 1 FColor of conference mode window +u008A rmb 1 +u008B rmb 1 +u008C rmb 1 +u008D rmb 1 Foreground color of original screen +u008E rmb 1 Background color of original screen +u008F rmb 1 Border color of original screen +u0090 rmb 1 X size of main window +u0091 rmb 1 Y size of main window +u0092 rmb 1 +u0093 rmb 2 Ptr to next filename (from dir read) +u0095 rmb 2 +u0097 rmb 2 +u0099 rmb 1 +u009A rmb 1 +u009B rmb 1 filename present for Upload/Download flag +u009C rmb 3 FColor codes +u009F rmb 32 old filename for downloads +u00BF rmb 2 +u00C1 rmb 26 +u00DB rmb 2 +u00DD rmb 2 +u00DF rmb 1 input buffer from modem (192 bytes) +u00E0 rmb 1 +u00E1 rmb 1 +u00E2 rmb 4 +u00E6 rmb 13 +u00F3 rmb 10 +u00FD rmb 1010 +u04EF rmb 1 +u04F0 rmb 31 +u050F rmb 255 Conference mode keyboard buffer +u060E rmb 255 Generic Entry from keyboard buffer +u070D rmb 1024 output buffer to screen (with conversion) +u0B0D rmb 255 +u0C0C rmb 32 Current SS.Opt settings for local keyboard +u0C2C rmb 2 +u0C2E rmb 34 +u0C50 rmb 16 Palette settings of original screen +u0C60 rmb 1 Start of buffer for converted ANSI sequences +u0C61 rmb 1 +u0C62 rmb 30 +u0C80 rmb 2 Ptr to converted ANSI buffer (C60) +u0C83 rmb 1 +u0C84 rmb 1 Currently selected menu item # in ==> menu +u0C85 rmb 3 +u0C8A rmb 1 Flag: 0=Not processing ANSI <ESC> sequence +u0C8B rmb 1 ??? (Inited to 0 if starting ANSI <ESC> sequence) +u0C8C rmb 1 +u0C8D rmb 2 Ptr to ANSI sequence (raw ANSI:u0B0D) +u0C8F rmb 2 current overlay window start co-ordinates +u0C91 rmb 2 current overlay window size +u0C93 rmb 1 possible remove +u0C94 rmb 1 current cursor X position +u0C95 rmb 1 current cursor Y position +u0C96 rmb 2 current X/Y co-ordinates? +u0C98 rmb 1 +u0C99 rmb 6 Place to hold F$Time packet +u0C9F rmb 1 +u0CA0 rmb 1 seems to be flag for upload/download (0=Upload) +u0CA1 rmb 2 +u0CA3 rmb 1 +u0CA4 rmb 1 +u0CA5 rmb 1 bit 8=Stop bits, bit 6=Word Len, bits 1-3=Baud +u0CA6 rmb 1 current terminal type (0=TTY, 1=OS9, 2=ANSI) +u0CA7 rmb 1 Current Echo type (0=Off, 1=On) +u0CA8 rmb 1 +u0CA9 rmb 1 +u0CAA rmb 1 +u0CAB rmb 1 Current hangup method (0=DTR drop, else +++ATH) +u0CAC rmb 1 Current Parity setting +u0CAD rmb 1 +u0CAE rmb 1 Auto Zmodem flag (0=Yes) +u0CAF rmb 1 Pause off char. code (for ASCII receive) +u0CB0 rmb 1 Pause on char. code (for ASCII receive) +u0CB1 rmb 33 +u0CD2 rmb 32 Current data directory path list +u0CF2 rmb 39 +u0D19 rmb 1 +u0D1A rmb 2 +u0D1C rmb 128 <ALT>-<1> programmable key buffer +u0D9C rmb 128 <ALT>-<2> programmable key buffer +u0E1C rmb 128 <ALT>-<3> programmable key buffer +u0E9C rmb 128 <ALT>-<4> programmable key buffer +u0F1C rmb 128 <ALT>-<5> programmable key buffer +u0F9C rmb 128 <ALT>-<6> programmable key buffer +u101C rmb 128 <ALT>-<7> programmable key buffer +u109C rmb 128 <ALT>-<8> programmable key buffer +u111C rmb 256 SSn strings (4 of 64 bytes each) +u121C rmb 256 RSn strings (4 of 64 bytes each) +u131C rmb 128 +u139C rmb 2 Pointer to RSn string we are working on +u139E rmb 1 # download protocols supported +u139F rmb 4 +u13A3 rmb 1 +u13A4 rmb 1 +u13A5 rmb 1 +u13A6 rmb 3 +* ??? rest big buffer, most used for text, input & output ??? +u13A9 rmb 1 Temp buffer for small text, etc. +u13AA rmb 6 +u13B0 rmb 137 +u1439 rmb 16 +u1449 rmb 112 +u14B9 rmb 512 +u16B9 rmb $2000-200-. ASCII recieve buffer (expanded by #xxK modifier) +u1F38 rmb 200 stack +DSize equ . + + fcc 'Program by Dave Philipsen Copyright (c) 1988, 1989,1992' + fcc / ('92 updates by Randy K. Wilson)/ + +L006F fdb 85 # bytes this message (?) ($55) + fcb C$FORM Clear screen + fcb $02,$23,$21 CurXY @ 3,1 + fcc 'SuperComm v2.2' + fcb $02,$24,$23 CurXY @ 4,3 + fcc 'Copyright (c)' + fcb $02,$23,$24 CurXY @ 3,4 + fcc '1988, 1989, 1992' + fcb $02,$26,$26 CurXY @ 6,6 + fcc 'written by' + fcb $02,$24,$27 CurXY @ 4,7 + fcc 'Dave Philipsen' + +L00C6 fdb 35 # bytes this message ($23) + fcb C$FORM Clear screen + fcb $02,$22,$21 CurXY @ 2,1 + fcc 'with updates by' + fcb $02,$22,$22 CurXY @ 2,2 + fcc ' Randy Wilson' + +L00EB fdb 28 # bytes this message ($1C) + fcb $02,$40,$20 CurXY @ 32,0 + fcb $1B,$32,4 Foreground color= Yellow + fcc 'SuperComm v2.2 ' + fcb $1B,$32,3 Foreground color= White + fcb $02,$58,$20 CurXY @ 55,0 + fcc '=' (for port '=' baudrate) + +L0109 fdb 454 # bytes this message ($C6) + fcc ' Use <ALT> key with the following keys:' + fcb C$CR,C$LF,C$LF + fcc ' A - Auto Dialer Q - Quit' + fcb C$CR,C$LF + fcc ' B - Baud Rates R - Reset Palettes' + fcb C$CR,C$LF + fcc ' C - Clear Screen S - OS9 Shell Access' + fcb C$CR,C$LF + fcc ' D - Change Directory T - Terminal Type' + fcb C$CR,C$LF + fcc ' H - Hang Up U - Update SuperComm' + fcb C$CR,C$LF + fcc ' I - Timer on/off Z - Conference Mode' + fcb C$CR,C$LF + fcc ' M - Open/Close Buffer <Up>- Upload file' + fcb C$CR,C$LF + fcc ' O - Change Options <Dn>- Download File' + fcb C$LF,C$CR,C$LF + fcc ' Select function or <Space> to continue' + +L02DC fcc 'ATH' Hangup string (does not need '0' on end) + fcb C$CR + +L02E0 fcc 'Shell' + +L02E5 fcb C$CR + +L02E6 fcc 'rz' + fcb C$CR + +L02E9 fcc '-vv ' + fcb C$CR + +L02F0 fdb 40 # bytes this message ($28) + fcb $02,$34,$20 CurXY @ 20,0 + fcc 'External ZModem File Receive' + fcb C$CR,C$LF,C$LF + fcb $1B,$25,0,3,$40,7 CWArea to 0,3 - 64,10 + +L031A fcc '*' ZModem Xfer signature + fcb $18 + fcc 'B0' + fcb $00 Byte to signify end of Zmodem Xfer signature + +* Window for ZModem Send +L0322 fdb 37 # bytes this message + fcb $02,$36,$20 CurXY @ 23,1 + fcc 'External ZModem File Send' + fcb C$CR,C$LF,C$LF + fcb $1B,$25,0,3,$40,7 CWArea to 0,3 - 64,10 + +* Hangup message +L0349 fdb 15 # bytes this message + fcb C$CR,C$LF + fcc ' Hanging Up!!' + +* Device to use VRN +L0360 fcc '/nil' + fcb C$CR + fcb $00 + +* Default time on-line string +L0366 fcb $02,$2b,$20 CurXY @ 11,0 + fcc '00:00:00' + +* Palette set #1 +L0371 fcb $00,$20,$00,$3F,$10,$20,$3F,$3F + fcb $00,$20,$00,$3F,$10,$20,$3F,$3F + +* Palette set for ANSI mode +L0381 fcb $00,$24,$12,$37,$09,$28,$1F,$3F + fcb $00,$24,$12,$37,$09,$28,$1F,$3F + +* Palette set for OS-9 mode +L0391 fcb $3F,$09,$00,$12,$24,$37,$28,$1F + fcb $3F,$09,$00,$12,$24,$37,$28,$1F + +* Default FColor,BColor,Border settings for ANSI +L03A1 fcb $07,$00,$00 + +* Default FColor,BColor,Border settings for OS-9 +L03A4 fcb $00,$02,$02 + +* Inverse/Underline/Blink OFF & clear screen +L03A7 fdb 7 # bytes this message + fcb $1F,$21,$1f,$23,$1f,$25,C$FORM + +* Shadowed overlay window (save switch on) +L03B0 fdb 18 # bytes this message +L03B2 fcb $1B,$22,1,0,0,80,23,1,1 + fcb $1B,$22,1,2,1,76,21,6,0 + +* Shadowed overlay windows remove (restore original screen) +L03C4 fdb 4 # bytes this message +L03C6 fcb $1B,$23,$1b,$23 OWEnd, OWEnd + +* Default settings? +L03D6 fdb 14 # bytes this message + fcb $1F,$21 Inverse off + fcb $1F,$23 Underline off + fcb $1F,$25 Blink off + fcb $1B,$32,7 Foreground color 7 + fcb $1B,$33,0 Background color 0 + fcb $05,$21 Cursor ON + +L03E6 fcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + fdb 2 # bytes this entry + fcb $1F,$22 Underline on + fcb 0,0 + fcb 2 # bytes this entry + fcb $1F,$24 Blink on + fcb 0,0,0,0,0,0,0 + fcb 2 # bytes this entry + fcb $1F,$20 Inverse on + fcb $00 + +* Foreground color settings +L040E fdb 3 # bytes this entry + fcb $1B,$32,0 Foreground color 0 + fdb 3 # bytes this entry + fcb $1B,$32,1 Foreground color 1 + fdb 3 # bytes this entry + fcb $1B,$32,2 Foreground color 2 + fdb 3 # bytes this entry + fcb $1B,$32,3 Foreground color 3 + fdb 3 # bytes this entry + fcb $1B,$32,4 Foreground color 4 + fdb 3 # bytes this entry + fcb $1B,$32,5 Foreground color 5 + fdb 3 # bytes this entry + fcb $1B,$32,6 Foreground color 6 + fdb 3 # bytes this entry + fcb $1B,$32,7 Foreground color 7 + +* Background color settings +L0436 fdb 3 # bytes this entry + fcb $1B,$33,0 Background color 0 + fdb 3 # bytes this entry + fcb $1B,$33,1 Background color 1 + fdb 3 # bytes this entry + fcb $1B,$33,2 Background color 2 + fdb 3 # bytes this entry + fcb $1B,$33,3 Background color 3 + fdb 3 # bytes this entry + fcb $1B,$33,4 Background color 4 + fdb 3 # bytes this entry + fcb $1B,$33,5 Background color 5 + fdb 3 # bytes this entry + fcb $1B,$33,6 Background color 6 + fdb 3 # bytes this entry + fcb $1B,$33,7 Background color 7 + +* Clear screen code +L045E fdb 1 # bytes this entry + fcb C$FORM + +* Erase to end of line +L0461 fdb 1 # bytes this entry + fcb $04 + +* Erase to end of screen +L0464 fdb 1 # bytes this entry + fcb $0B + +* Generic window descriptor +L0467 fcs '/W' + +* DWSet for main window: 80x23 text from 0,1 +L0469 fcb $1B,$24 DWEnd + fcb $1B,$20,2,0,1,80,23,7,2,2,$1b,$21 DWSet:80x23 text, 1 from top + +* DWSet for status line @ top window: 80x1 with blue background +* Done on Process' current screen (which is set by L0469 above) +L0475 fcb $1B,$24 DWEnd +L0477 fcb $1B,$20,0,0,0,80,1,3,4 DWSet: 80x1, same scrn, blue bckgrnd + fcb C$FORM Clear the line + +L0481 fcb $1B,$32,0 Foreground color=0 + fcb $1B,$33,0 Background color=0 + fcb C$FORM Clear screen + + fdb 1 + fcc / / + +L048B fdb 2 + fcb $05,$21 + +L048F fdb 2 + fcb $05,$20 + +L0493 fcb $1F,$20 Inverse on + fcb $20 Space + fcb $1F,$21 Inverse off + fcb C$BSP Backspace + +L0499 fdb 22 # bytes this message + fcb C$CR,C$LF + fcc ' Are you sure? (y/N)' + +L04B1 fdb 40 # bytes this message + fcb $02,$2e,$23 CurXY @ 14,3 + fcc 'Count ' + fcb $02,$2e,$25 CurXY @ 14,5 + fcc 'Seconds ' + fcb $02,$2d,$27 CurXY @ 13,7 + fcc '<Space> aborts' + fcb $05,$20 Turn off cursor + +L04DB fdb 8 # bytes this message + fcc 'Dialing ' + +L04E5 fdb 3 # bytes this message + fcb $02,$37,$23 CurXY @ 23,3 + +L04EA fdb 3 # bytes this message + fcb $02,$37,$25 CurXY @ 23,5 + +L04EF fdb 32 # bytes this message + fcc ' Xmodem file transfer system' + +L0511 fdb 9 # bytes this message + fcb $02,$20,$20 CurXY @ 0,0 + fcc ' Y' + +L051C fdb 17 # bytes this message + fcb $02,$2b,$26 CurXY @ 11,6 + fcc '<Break> aborts' + +L052F fdb 17 # bytes this message + fcb $02,$2A,$28 CurXY @ 10,8 + fcc '<Break> aborts' + + fdb 27 # bytes this message + fcb $02,$25,$22 CurXY @ 5,2 + fcc 'ASCII Processing? (Y/N) ' + +L055F fdb 10 # bytes this message + fcb $02,$21,$24 CurXY @ 1,4 + fcc 'File: ' + fcb $04 Clear to end of line + +L056B fdb 10 # bytes this message + fcb $02,$21,$22 CurXY @ 1,2 + fcc 'Recv: ' + fcb $04 Clear to end of line + +L0577 fdb 10 # bytes this message + fcb $02,$21,$23 CurXY @ 1,2 + fcc 'Size: ' + fcb $04 Clear to end of line + +L0583 fdb 14 # bytes this message + fcb $02,$21,$24 CurXY @ 1,4 + fcb $04 Clear to end of line + fcb $02,$21,$22 CurXY @ 1,2 + fcc 'Send: ' + fcb $04 Clear to end of line + +L0593 fdb 34 # bytes this message + fcb $02,$21,$25 CurXY @ 1,5 + fcc 'Block # Error #' + +L05B7 fdb 14 # bytes this message + fcb $02,$21,$27 CurXY @ 1,7 + fcc 'Last Error:' + +L05C7 fcc ' ' + fcc 'Transfer Aborted ' + fcc 'Wrong Block Number ' + fcc 'Block Check Failed ' + fcc 'Time Out ' + +L062B fdb 7 # bytes this message + fcb $02,$28,$25 CurXY @ 8,5 + fcc '0000' + +L0634 fdb 7 # bytes this message + fcb $02,$40,$25 CurXY @ 32,5 + fcc '0000' + +* ???? No label was pointing to it, was after baud rate table (L0652) +* NOTE: MAY BE POSSIBLE TO DELETE FOLLOWING 8 BYTES + fdb 6 # bytes this message + fcb $1B,$25,1,2,4,9 CWArea from 1,2 to 5,11 + +L0682 fcb C$BSP,C$BSP,C$BSP + fcc ' ' + +L0688 fcb C$FORM Clear screen + fcb C$LF,C$LF,C$LF,C$LF,C$LF,C$LF,C$LF,C$LF,C$LF,C$LF + +L0693 fcc '==>' + +L0696 fdb 24 # bytes this message + fcb C$LF,C$CR + fcc ' Terminal Type : ' + +L06B0 fcc 'OS9 ' + fcc 'ASCII' + fcc 'ANSI ' + +L06BF fcb $02,$30,$21 CurXY @ 16,1 + fcc 'ASCII' + +L06C7 fdb 8 # bytes this message + fcb $02,$30,$21 CurXY @ 16,1 + fcc ' ' + +* Keywords in ADF (Autodial) files +L06D1 fcs 'ADS' + fcs 'BPS' + fcs 'ECH' + fcs 'HEK' + fcs 'TRM' + fcs 'LNF' + fcs 'XON' + fcs 'XOF' + fcs 'RTR' + fcs 'RPS' + fcs 'PAR' + fcs 'CLK' + fcs 'WRD' + fcs 'STP' + fcs 'KM1' + fcs 'KM2' + fcs 'KM3' + fcs 'KM4' + fcs 'KM5' + fcs 'KM6' + fcs 'KM7' + fcs 'KM8' + fcs 'CNS' + fcs 'SS1' + fcs 'SS2' + fcs 'SS3' + fcs 'SS4' + fcs 'RS1' + fcs 'RS2' + fcs 'RS3' + fcs 'RS4' + fcs 'RLF' + fcs 'TLF' + +* Receive protocol menu +L0734 fdb 111 # bytes this message + fcc ' SuperComm File Receive' + fcb C$CR,C$LF,C$LF + fcc ' ASCII Receive' + fcb C$CR,C$LF + fcc ' XModem (and X-1k)' + fcb C$CR,C$LF + fcc ' YModem Batch' + fcb C$CR,C$LF + fcc ' ZModem (external)' + +* File send menu +L07A5 fdb 123 # bytes this message + fcc ' SuperComm File Send' + fcb C$CR,C$LF,C$LF + fcc ' ASCII Send' + fcb C$CR,C$LF + fcc ' XModem (and CRC)' + fcb C$CR,C$LF + fcc ' Xmodem 1K' + fcb C$CR,C$LF + fcc ' YModem Batch' + fcb C$CR,C$LF + fcc ' ZModem (external)' + +* Options menu +L0821 fdb 147 # bytes this message + fcc ' SuperComm Options' + fcb $1B,$25,5,2,14,12 CWArea from 5,2 to 19,14 + fcc 'Echo' + fcb C$CR,C$LF + fcc 'L-Feeds Rx' + fcb C$CR,C$LF + fcc 'L-Feeds Tx' + fcb C$CR,C$LF + fcc 'Click' + fcb C$CR,C$LF + fcc 'Word Length' + fcb C$CR,C$LF + fcc 'Parity' + fcb C$CR,C$LF + fcc 'Stop Bits' + fcb C$CR,C$LF + fcc 'Echo (host)' + fcb C$CR,C$LF + fcc 'Hang Up' + fcb C$CR,C$LF + fcc 'Auto Zmodem' + fcb C$CR,C$LF + fcc 'Auto Ascii' + fcb C$CR,C$LF + fcb $1B,$25,0,0,22,14 CWArea from 0,0 to 22,14 + +* Re-saving Supercomm message +L08B6 fdb 23 # bytes this message + fcb C$CR,C$LF + fcc ' Saving SuperComm...' + +L08CF fdb 23 # bytes this message + fcb C$FORM Clear screen + fcb $02,$29,$20 CurXY @ 9,0 + fcc 'File Capture System' + +L08E8 fdb 38 # bytes this message + fcc '"' + fcb $02,$21,$24 CurXY @ 1,4 + fcc 'is already open. Close it? (Y/n) ' + +L0910 fdb 19 # bytes this message + fcb $02,$2b,$22 CurXY @ 11,2 + fcb $03 Erase current line + fcc 'Send ASCII file' + +L0925 fdb 4 # bytes this message + fcb $02,$21,$22 CurXY @ 1,2 + fcc '"' + +L092B fdb 51 # bytes this message + fcb $02,$29,$20 CurXY @ 9,0 + fcc 'File already exists!' + fcb $02,$26,$22 CurXY @ 6,2 + fcc '<A>ppend or <O>verwrite? ' + +* Buffer open indicator +L0960 fdb 11 # bytes this message + fcb $02,$6e,$20 CurXY @ 78,0 + fcb $1F,$24 Blinking on + fcb $1B,$32,3 Foreground color=3 + fcc 'B' + fcb $1F,$25 Blinking off + +* Buffer closed indicator +L096D fdb 10 # bytes this message + fcb $02,$6e,$20 CurXY @ 78,0 + fcb $1B,$32,0 Foreground color=0 + fcc 'B' + fcb $1B,$32,3 Foreground color=3 + +L0979 fdb 4 # bytes this message + fcc 'DTR' + fcb $04 Clear to end of line + +L0985 fdb 4 # bytes this message + fcc 'Off' + fcb $04 Clear to end of line + +L098B fdb 3 # bytes this message + fcc 'On' + fcb $04 Clear to end of line + +L0990 fcc ' ' +L0991 fcc 'Mark' +L0995 fcc 'Space' +L099A fcc ' ' +L099B fcc 'Even' +L099F fcc ' ' +L09A0 fcc 'Odd ' +L09A4 fcc ' ' +L09A5 fcc 'None' + +L09A9 fdb 54 # bytes this message + fcb $02,$28,$20 CurXY @ 8,0 + fcc 'Change Data Directory' + fcb $02,$29,$25 CurXY @ 9,5 + fcc '(use full pathname)' + fcb $02,$21,$24 CurXY @ 1,4 + fcc 'Path:' + +L09E1 fcb $02,$20,$20 + fcc / / + +L09E8 fcb $02,$20,$20 CurXY @ 0,0 + fcc 'Conf' + +L09EF fcb $1B,$25,0,1,80,2 CWArea to 0,1 to 80,3 + +* Table for converting long Integers (used for file size printing) +* Will handle sizes up to 9,999,999 bytes +L09F5 fdb $000F,$4240 1,000,000 + fdb $0001,$86A0 100,000 + fdb $0000,$2710 10,000 + fdb $0000,$03E8 1,000 + fdb $0000,$0064 100 + fdb $0000,$000A 10 + fdb $0000,$0001 1 + fdb $0000,$0001 0 + +L0A15 fcb $0E + +* Acceptable entries on help screen +L0A16 fcc 'ABCDHIMOQRSTUZ' + +* Default option switches +L0A24 fcb $04 default word length, stop bits & baud rate + fcb $02 + fcb $00 echo + fcb $00 linefeeds Rx + fcb $00 linefeeds Tx + fcb $00 key click + fcb $00 hangup method + fcb $00 parity + fcb $00 auto ASCII (0=Off) + fcb $00 auto ZModem (0=On) + fcb $11 default XON value + fcb $13 default XOFF value + fcb $00 echo (host) + +L0A31 fcs '/dd/sys/dial' + fcc ' ' + +L0A51 fcc '/dd' + fcb C$CR + fcc ' ' + +**************************** +* Main Entry point +* Note: Eventually change to use Ext. addressing +start stx <u0000 Save Param area ptr + leax -$40,x End of rec. bffr is 64 bytes from end of data mem + stx <u0002 Save end of receive buffer ptr + leas -1,s Reserve 1 byte on stack + ldx #u16B9 Point to start of receive buffer + stx <u0004 Save start of receive buffer ptr (constant) + stx <u0006 Save current end of receive buffer ptr + leax -1,x Move ptr 1 back + stx <u000B Save it + ldx #u14B9 Point to ??? + stx <u000D Save that ptr twice + stx <u000F + ldd #$0000 Clear out something to 0 + std <u0009 + ldx #u0019 Point X to $19 in data area +* Clear out all memory from $19 to end of Data mem-64 +L0A96 sta ,x+ Clear byte out + cmpx <u0002 Done all data mem yet? + blo L0A96 No, keep going until done + ldx <u0000 Get param area ptr back + lda #C$SPAC Get char for space + sta -1,x Save as char before param area + +* Parse parameters for device name +L0AA2 lda ,x+ Get param char + cmpa #C$CR End of params? + beq L0AB6 Yes, skip ahead + cmpa #'/ Start of device name? + bne L0AA2 No, eat char & continue + lda -2,x Get char before the '/' + cmpa #C$SPAC Was it a space? + bne L0AA2 No, eat '/' and continue parsing + leax -1,x It was, bump ptr back to '/' + bra L0ABA Skip ahead + +* Default modem port +L035A fcc '/t2' + fcb C$CR + fcb $00,$00 +* +L0AB6 leax <L035A,pc Point to '/t2' +L0ABA ldy #u002D Point to spot in data mem + ldb #10 Max # bytes to copy +L0ABF lda ,x+ Get char from device to use as modem port + cmpa #C$CR Hit end yet? + beq L0ACA Yes, skip ahead + sta ,y+ Save char + decb Past max count yet? + bne L0ABF No, keep copying +L0ACA sta ,y+ Save CR too + lbsr L12F5 Go save original screen attributes + lbcs L0F15 If not window-capable, exit with error + lbsr L1A8A set main window to full size possible + lbcs L0F15 If error, exit with it + lda #$01 + sta <u0065 + ldx #$0003 sleep to allow window to init. + os9 F$Sleep + ldd #1*256+SS.Montr Get monitor type + os9 I$GetStt + bcs L0B1D Error, exit + tfr x,d Move to splittable register + stb >u0C84 save monitor type + ora >u0C84 ??? OR with 0? + sta <u0065 save monitor type + leax L0A24,pc point to default option table & directorys + ldy #u0CA5 + ldb #$4D get size of data + lbsr L2D1E move it + lda #READ. + leax L0A51,pc point to default directory name + os9 I$ChgDir + leax L0366,pc point to default time on-line + ldy #u0077 + ldb #$0B get size of data + lbsr L2D1E move it +L0B1D lbsr L1BDF set palettes based on monitor type + lbsr L1C57 + lbsr L1BC7 initialize batch file xfer names? + leax L0F18,pc point to intercept trap + os9 F$Icpt +* Get special version flag from system direct page (offset $7C) +* all this byte does in this source is add a 'a' to the version # on the +* status line + ldx #u00DF point to a DAT buffer + ldd #$0000 get DAT image + std ,x store it + std 2,x + std 4,x + stb 6,x + tfr x,d + ldx #$7C get offset into System DP (no idea what it is) + ldy #1 get # bytes + ldu #u0019 point to location to copy + os9 F$CpyMem get the byte +* Setup VRN + leax L0360,pc point to VRN pathname + lda #UPDAT. + os9 I$Open + bcs L0B92 If VRN not around, skip ahead + sta <u0072 save path # to VRN + ldb #$81 get code to setup VIRQ timer + ldy #1 get enable flag + ldx #60 get timer count + os9 I$SetStt start timer + bcs L0B89 + lda <u0072 get VRN path again + ldb #$80 get code to clear & report VIRQ calls + os9 I$GetStt get VIRQ counts & reset + bcs L0B89 + cmpx #$0800 + bhs L0B89 + cmpy #$0800 + blo L0B92 +L0B89 lda <u0072 get path to VRN again + os9 I$Close close it + clr <u0072 clear path # to VRN +* No VRN available comes here +L0B92 ldx #u050F Point to ??? + stx <u0066 Save ptr + ldd #$0100 ??? Init some values + std >u0D19 + ldd #$1B32 Foreground color prefix + std <u009C Save it +* Print title screens + leax L045E,pc point to CLS + lbsr L1B03 do it + leax L048F,pc point to CuOff + lbsr L1B03 do it + ldd #$1A04 get overlay start coords + std >u0C8F + ldd #$1609 get overlay size + std >u0C91 + lbsr L1C81 place overlay window on screen + leax L006F,pc point to title #1 + lbsr L1B03 print it + lbsr L1AE8 init small window on top line + ldx #$001C get sleep time + lbsr L0F56 sleep for title pause + ldd #$3210 get overlay start co-ordinates + std >u0C8F + ldd #$1304 get overlay size + std >u0C91 + lbsr L1C81 place overlay on screen + leax L00C6,pc point to title #2 + lbsr L1B03 print it + lbsr L3BBC copy current seconds +L0BF7 ldd #SS.Ready Get code to check data ready on Std In + os9 I$GetStt any data from keyboard? + bcc L0C08 yes, skip ahead + lbsr L3BDA check timeout + cmpa #$0A did it timeout? + blo L0BF7 no, try again + bra L0C0B + +L0C08 lbsr L2AC5 purge the data from keyboard +L0C0B lbsr L1CDE remove overlay windows + lbsr L1CDE + leax L048B,pc point to CurOn + lbsr L1B03 do it + lda #UPDAT. get mode for modem path + ldx #u002D point to modem path + os9 I$Open open it + lbcs L0F15 If error, exit with it + sta <u002B save path to modem + leax L045E,pc point to CLS + lbsr L1B03 do it + lbsr L117F get path options from modem + lbsr L2B86 print status line + lbsr L4403 scan parameters for '-f=' (capture buffer) + ldd #$0103 init cursor position + std >u0C94 +* NOTE: may want to have Supercomm make this an option (self-modify code +* to change LBSR opcode to LBRN or vice versa) + lbsr L2AF5 toggle DTR to hangup modem + lbsr L134D get local keyboard path options + lbsr L12B5 set them to what I need + clra Std In path + leax L031A,pc point to ZModem xfer header + stx <u006C save pointer to it + ldx #u060E Point to buffer for key presses + ldy #$0001 + os9 I$Read + lbra L157B enter main loop (without read from keyboard) + +* Check if data waiting for keyboard +L13C2 ldd #SS.Ready Check if data ready on keyboard (Std In) + os9 I$GetStt + rts + +* Main processing loop +L0C5E lda <u002B Get path to modem + ldb #SS.Ready Check for data ready + os9 I$GetStt Any data ready? + bcc L0FB8 yes, go process + tst <u0023 sending ASCII file? + lbne L44B6 yes, read & write next line + ldx #3 get # ticks to wait + lbsr L0F56 go wait +L0C72 bsr L13C2 any data from keyboard? + bcs L0C5E no, try modem again +* Keyboard data ready + tst <u0040 conference mode? + lbne L273D yes, go read data from keyboard + lbra L156E go read & process keyboard data + +* Process modem data - only comes here if at least 1 char available +* Entry: B=Number of characters available on serial port +* Modified 94/03/27 for 256 byte buffer +L0FB8 clra clear MSB of length + tfr d,y move length to Y + lda <u002B get path to modem + ldx #u00DF point to buffer + os9 I$Read get the data + bcs L1023 error, skip ahead + sty <u0C88 save # bytes read +L0FD2 beq L1017 If no data, skip ahead + lda >u0CAE Is Auto-Zmodem enabled? + bne L0FE1 no, check continue + lbsr L1062 Check for an Auto-ZModem header +L0FE1 lda <u0C82 Get which search/reply string we are doing + beq L0FF4 None, skip checking search/reply strings + cmpa #$05 Have we finished the 4 max. allowed? + bne L0FF1 No, go check for this one + clra Done all of them, clear it out to skip thru faster + sta <u0C82 + bra L0FF4 Skip checking auto-logon sequences + +L0FF1 lbsr L254A Go check for auto-logon sequences +L0FF4 bsr L1040 convert & move data to output buffer + lda #1 get path to window + ldx #u070D point to parsed data + ldy <u0C88 get amount of data + beq L1017 none, skip ahead + os9 I$Write print data on screen + tst <u0025 Is there an ASCII receive buffer file going? + beq L1017 No, skip ahead + tst <u0026 Is the buffer OPEN? + beq L1017 No, skip ahead + lbsr L4394 Go handle receive buffer +L1017 lbsr L453B Go handle screen buffer + tst >u0C83 + beq L1023 + lbsr L25B1 +L1023 tst <u006B Zmodem flag? + bpl L1036 No zmodem, skip ahead + clr <u006B Clear it out + tst >u0CA0 Sending or receiving? + lbeq L1859 Sending; do ZModem file send + lbra L1793 Do Zmodem file receive + +L1036 tst <u0023 Are we sending an ASCII file? + beq L0C72 No, go check the keyboard + lbra L0C5E go back to main loop + +* Convert modem text to TTY/ANSI/OS9 codes +L1040 ldx #u00DF Point to modem buffer + ldy #u070D Point to screen output buffer + ldb <u0C89 Get # bytes waiting in modem buffer + lda >u0CA6 get terminal type + lbeq L2D1E TTY, copy buffer with no editing & exit + deca OS9? + beq L0C8D Yes, go do + deca ANSI? + beq L0CF6 Yes, go (illegal values fall thru to OS9:was TTY) + +* Loop to Convert OS9 codes to output buffer +* NOTE: ORIGINALLY STRIPPED HI-BIT OFF OF CHARS (anda #$7f) & also had code +* after the strip to cmpa #$7f/BHI L0CA2, which would eat the char. Taken +* out to allow foreign & extra chars through. May want to add parser later +* to eat '.' illegal chars, but leave foreign symbols alone. +L0C8D lda ,x+ get a byte + cmpa #C$SPAC control chars? + blo L0CA2 yes, skip ahead + lbsr L13CF update internal cursor position +L0C9C sta ,y+ save to output buffer +L0C9E decb done all data? + bne L0C8D no, keep going + rts return + +* Parse control codes +L0CA2 cmpa #C$BSP backspace? + bne L0CAB no, check CR + lbsr L13EC + bra L0C9C go save char in output buffer & continue + +L0CAB cmpa #C$CR carriage return? + bne L0CC5 no, check CLS + lbsr L1405 u0C94=1 + tst >u0CA8 Auto line feed on? + beq L0C9C No, go save char in output buffer +* NOTE: CHANGE 140E TO ONLY PSHS A, ONLY LDA u0C95,u ETC. + lbsr L140E Go bump Y coord down by 1 for auto-lf on CR + inc <u0C89 Increase size of converted buffer by 1 + sta ,y+ Save CR in output buffer + lda #C$LF Get Line feed + bra L0C9C Go add that to buffer too + +L0CC5 cmpa #C$FORM CLS? + bne L0CCE no, check bell + lbsr L1422 u0C94 = $0101 + bra L0C9C Go save CLS code in output buffer + +L0CCE cmpa #C$BELL bell? + beq L0C9C Yes, go save in output buffer + cmpa #C$LF linefeed? + bne L0CDB No, check Up one line + lbsr L140E Go bump Y coord down by 1 + bra L0C9C Save LF in output buffer + +L0CDB cmpa #$09 Up one line code? + bne L0CE4 No, check next +* NOTE: USELESS LBSR...PERHAPS LEFT IN FOR AN OPTION TO HAVE CHR$(9) BE EITHER +* UP 1 LINE (FOR OS9) OR TAB CHAR??? IF REMOVING, SHOULD ALSO REMOVE RTS @ +* 1BDE +* lbsr L1BDE Spot reserved for TAB handler + bra L0C9E Eat the char & continue +* All other <CTRL> chars& chars >128, don't save in buffer? +L0CE4 dec <u0C89 Shrink size of converted buffer by 1 + bra L0C9E Eat char & continue + +L0CF6 lda >u0C8A Are we processing an <ESC> sequence? + lbne L0D9F yes, go to ANSI processor + lda ,x+ get data + cmpa #C$SPAC printable? + blo L0D13 no, check control codes + cmpa #$80 Hi bit char? + blo L0D0A No, save it in out buffer + lda #'* Yes, replace with '*' +L0D0A lbsr L13CF update internal cursor position +L0D0D sta ,y+ Save char in buffer +L0D0F decb + bne L0CF6 + rts + +L0D13 cmpa #C$BSP is it backspace? + beq L0D31 yes, go process + cmpa #C$CR is it carriage return? + beq L0D42 yes, go process + cmpa #C$LF is it line feed? + beq L0D58 yes, go process + cmpa #C$FORM Clear screen? + beq L0D5D Yes, go process + cmpa #C$BELL <CTRL>-<G> Bell? + beq L0D0A Yes, go process + cmpa #C$EOF <ESC>? + beq L0D62 Yes, ANSI code coming...go set up +L0D2B dec <u0C89 decrement # chars in converted output buffer + bra L0D0F Eat the char & continue processing + +* Process backspace - ANSI (OS9, if it backspaces off left side, will go up +* 1 line & set the cursor to the right side. ANSI will stop at the left side +L0D31 pshs a Save char + lda >u0C94 get cursor X position + cmpa #$01 Already at far left side? + puls a Restore char + beq L0D2B Already @ left side, eat char & continue + dec >u0C94 Bump X cursor coord left by 1 + bra L0D0D continue processing + +* Process carriage return +L0D42 lbsr L1405 Reset X coord to 1 + tst >u0CA8 Auto LF on? + beq L0D0D No, go save CR + lbsr L140E Yes, bump up Y coord by 1 + inc <u0C89 Bump up size of converted output buffer by 1 + sta ,y+ Save CR char in output buffer + lda #C$LF Also add an LF + bra L0D0D + +* Process line feed +L0D58 lbsr L140E Bump Y coord up by 1 + bra L0D0D Go save LF in converted output buffer + +* Process CLS +L0D5D lbsr L1422 Set X&Y coords to 1,1 + bra L0D0D Save char in converted output buffer + +* Process <ESC> +L0D62 inc >u0C8A flag <ESC> received + clr >u0C8B + lda #$FF ??? Init ANSI convert buffer to empty + pshs x Save converted output buffer ptr + ldx #u0C60 ??? Point to ANSI convert buffer? + stx >u0C80 Save ptr + clr ,x Clear our 2 of ANSI convert bytes + clr 1,x + sta 2,x Flag end of ANSI convert buffer + ldx #u0B0D Point to start of ANSI seq. bffr (no ESC) + stx >u0C8D Save ptr to it + dec <u0C89 Dec # chars in converted output buffer + puls x Restore converted output ptr + bra L0D0F Eat the ESC for now & continue + +* Parse ANSI escape sequence +* Entry: X=Modem buffer ptr, Y=Converted output buffer ptr, B=# bytes to do +L0D9F ldu >u0C8D get ANSI sequence buffer ptr + lda ,x+ get character + sta ,u+ save it into ANSI sequence buffer + stu >u0C8D save updated ANSI sequence buffer ptr + cmpa #'[ the start char? + beq L0DB9 yes, continue + cmpa #'@ printable char? + bhi L0DC0 yes, check for finish +L0DB9 dec <u0C89 decrement converted output buffer count + lbra L0D0F continue + +* Start ANSI sequence found (<ESC>-[) +L0DC0 clr >u0C8A Clear out ANSI sequence found flag??? + sta >u0C8C Save char + dec <u0C89 Dec converted output buffer count + pshs y,b Preserve converted output bffr ptr&# chars left + ldy >u0C80 Get ptr to converted ANSI buffer + lda #$FF Flag as unused for now + sta ,y + ldy #u0C60 Point to converted ANSI buffer + sty >u0C80 + ldy #u0B0D+1 Point to Start of ANSI sequence buffer (no ESC)+1 + sty >u0C8D Save ptr +L0DEE lda ,y+ Get char + cmpa #$40 '@' + bhi L0E3B Letter or higher, go do + cmpa #$3A ':' + blo L0DFC Possible ASCII numeric, skip ahead + ldb #$FE + bra L0E19 + +L0DFC suba #$30 Drop possible numeric down to binary equivalent + sta >u0C84 Save it + lda ,y+ Get next char + cmpa #'9 above numeric? + bhi L0E33 Yes, skip ahead + suba #$30 Bump down to binary version + sta >u0C85 Save it + lda >u0C84 Get 1st one again (10's digit) + ldb #10 Multiply by 10 + mul + addb -1,y Add in one's digit + subb #$30 +L0E19 pshs x + ldx >u0C80 + stb ,x+ + ldb #$FF + stb ,x + stb 1,x + stb 2,x + stx >u0C80 + puls x + bra L0DEE + +L0E33 leay -1,y + ldb >u0C84 + bra L0E19 + +L0E3B puls y,b + lda >u0C8C + cmpa #$6D m + beq L0E84 + cmpa #$4A J + lbeq L10E2 + cmpa #$66 f + lbeq L1467 + cmpa #$48 H + lbeq L1467 + cmpa #$43 C + lbeq L14B0 + cmpa #$44 D + lbeq L14F4 + cmpa #$41 A + lbeq L151D + cmpa #$42 B + lbeq L1546 + cmpa #$73 s + lbeq L1433 + cmpa #$75 u + lbeq L1442 + cmpa #$4B K + lbeq L1102 + lbra L0D0F + +L0E84 pshs x,d + ldx #u0C60 +L0E8A lda ,x+ + cmpa #$FF + beq L0EA6 + tsta + beq L0EDD + cmpa #$01 + beq L0E8A + cmpa #$08 + blo L0EAB + cmpa #$26 + blo L0EB3 + cmpa #$30 + blo L0EC8 + bra L0E8A + +L0EA6 puls x,d + lbra L0D0F + +L0EAB pshs x + leax >L03E6,pc + bra L0EE3 + +L0EB3 ldb <u0065 + cmpb #$02 + beq L0E8A + cmpa #$1E + blo L0E8A + suba #$1E + pshs x + leax >L040E,pc + bra L0EE3 + +L0EC8 ldb <u0065 + cmpb #$02 + beq L0E8A + cmpa #$28 + blo L0E8A + suba #$28 + pshs x + leax >L0436,pc + bra L0EE3 + +L0EDD pshs x + leax >L03D6,pc +L0EE3 ldb #5 + mul + leax b,x + lbsr L10D2 + puls x + bra L0E8A + +L0EEF lda <u003E Get path # to status window + os9 I$Close Close it + lbsr L134D + lbsr L135C + lbsr L13BA + lda <u0072 Get path # to VRN + beq L0F06 None, skip ahead + os9 I$Close Close it +L0F06 tst <u0025 + beq L0F14 + lbsr L43CA + lda <u002A + os9 I$Close +L0F14 clrb +L0F15 os9 F$Exit +L0F18 cmpb #$80 + bne L0F1F + inc <u0073 +L0F1F rti + +* Update on-screen timer +L0F20 pshs y,x,a + ldx #u009C Point to FColor buffer + lda <u0088 Get bckgrnd color of main window + sta $02,x Save as color to use + lda <u003E Get path # to status line window + ldy #$0003 + os9 I$Write Set foreground color + ldx #u0077 Send out current Timer string + ldy #$000B + os9 I$Write + ldx #u009C Point to Fcolor buffer + lda <u0087 Get foreground color + sta $02,x Save it + lda <u003E Get path to status window + ldy #$0003 Change color on status window back to normal + os9 I$Write + puls pc,y,x,a + +* Entry: X=# ticks to sleep +L0F56 tst <u0075 Is the timer function on? + beq L0F6F No, go to sleep + pshs a Preserve # seconds + lda <u0074 Yes, get current # seconds +L0F60 cmpa <u0073 Different than last recorded # seconds? + beq L0F6D No, go to sleep + bsr L0F78 Yes, go update timer on status bar + inca Bump # seconds up + sta <u0074 Save # seconds + bra L0F60 Check if it is different than last recorded? + +L0F6D puls a Restore # seconds +L0F6F os9 F$Sleep Sleep for requested # ticks + cmpx #$0000 Sleep for full requested period? + bne L0F56 No, go update timer functions & sleep some more + rts Yes, return + +L0F78 pshs y,x,d Preserve regs + ldx #u0077 Point to ASCII on-screen timer packet + ldb #10 Point to end of packet (1's of seconds field) +L0F7F bsr L0F8C Do 1 char at a time + tsta Do we need the next field updated too? + bpl L0FAC No, go update it on screen & return + decb Bump timer packet ptr down to previous field + decb + cmpb #$04 Hit beginning (finished hours)? + bhs L0F7F No, go update next field +L0FAC lda <u003E Get path to status window + ldy #$000B Get size of time string + os9 I$Write Write it out + puls pc,y,x,d Restore & return + +* Update 1's field +L0F8C lda b,x Get byte from timer + cmpa #'9 9? + beq L0F96 Yes, skip ahead +L0F90 inca No, increment it to next one + sta b,x Save result & return + rts + +* Update 10's field +L0F96 lda #'0 Wrap it back to a 0 + sta b,x Save 0 + decb Bump ptr to 10's field in ASCII time packet + lda b,x Get char + cmpa #'5 5? + bne L0F90 No, safe to increment & exit +L0FA5 lda #'0 Wrap it back to 0 + sta b,x Save it + lda #$FF Flag to say we need next field (minutes/hours) + rts updated & return + +L1062 pshs y,x,d Preserve regs + ldb <u0C89 Get LSB of size of converted text buffer + ldy <u006C Get ptr to Zmodem start header + ldx #u00DF Get ptr to modem buffer +L1070 tstb + beq L10A8 + tst <u006B + beq L1084 + lda ,x + cmpa #$30 + beq L10C1 + cmpa #$31 + beq L10C7 + bra L1090 + +L1084 lda ,x+ + anda #$7F + decb + clr <u0071 +L108C cmpa ,y + beq L10AA +L1090 leay >L031A,pc + sty <u006C + tst <u0071 + bne L10A2 + inc <u0071 + bra L108C + +L10A2 clr <u0071 + tstb + bne L1084 +L10A8 puls pc,y,x,d + +L10AA leay 1,y + sty <u006C + tst ,y + bne L10A2 + inc <u006B + leay >L031A,pc + sty <u006C + bra L1070 + +L10C1 inc >u0CA0 + bra L10CB + +L10C7 clr >u0CA0 +L10CB lda #$FF + sta <u006B + bra L10A8 + +L10D2 ldb 1,x + leax 2,x +L10D6 lda ,x+ + sta ,y+ + inc <u0C89 + decb + bne L10D6 + rts + +L10E2 pshs x,d + ldx #u0C60 + lda ,x + cmpa #$02 + beq L10F7 + leax >L0464,pc + bsr L10D2 +L10F4 lbra L0EA6 + +L10F7 leax >L045E,pc + bsr L10D2 + lbsr L1422 + bra L10F4 + +L1102 pshs x,d + leax >L0461,pc + bsr L10D2 + lbra L0EA6 + +* Print help screen +* Entry: None +L110D ldd #$1A01 get overlay start co-ordinates + std >u0C8F + ldd #$340D get overlay size + std >u0C91 + lbsr L1C81 place overlay + leax L0109,pc point to help screen text + lbsr L1B03 print it + leax L048F,pc turn off cursor + lbsr L1B03 +L112C lbsr L2AC5 wait for a keypress + cmpa #$20 was it space? + beq L116B yes, clean up & return + cmpa #$05 + beq L116B yes, clean up & return + cmpa #$0C + bne L113F +L113B adda #$80 + bra L1156 + +L113F cmpa #$0A + beq L113B + ldb L0A15,pc get # commands possible + leax L0A16,pc point to command table +L114B cmpa ,x+ find it? + beq L1154 yes, go parse it + decb done? + bne L114B no, keep looking + bra L112C not legal, go wait for new keypress + +L1154 adda #$A0 +L1156 pshs a + leax L03C4,pc get rid of overlay + lbsr L1B03 + leax L048B,pc turn cursor on + lbsr L1B03 + puls a restore command + lbra L1597 go parse command + +L116B leax L03C4,pc get rid of overlays + lbsr L1B03 + lbsr L1BAD purge all remaining keyboard data + leax L048B,pc turn cursor on + lbsr L1B03 + lbra L0C5E return to main loop + +* Get modem path options +L117F pshs x,d Preserve regs used + lda <u002B Get path # to modem + clrb SS.Opt call + ldx #u0C2E Point to buffer to hold Option section + os9 I$GetStt Get modem path options + puls pc,x,d Restore regs & return + +* Update status line (baud, word length, etc...) +* Entry: None +L118F pshs d,x,y + ldx #u0C2E point to + ldb >u0CA5 get baud + stb PD.BAU-PD.OPT,x + ldb PD.PAR-PD.OPT,x + andb #$0F + orb >u0CAC + stb PD.PAR-PD.OPT,x + ldb >u0CAF + stb PD.XON-PD.OPT,x + ldb >u0CB0 + stb PD.XOFF-PD.OPT,x + ldb >u0CB1 + stb PD.EKO-PD.OPT,x + ldb >u0CA9 + stb PD.ALF-PD.OPT,x + clr PD.PAU-PD.OPT,x + leax PD.BSP-PD.OPT,x + ldd #$000a Clear 10 bytes from BSP to BSE +L11C8 sta ,x+ + decb + bne L11C8 + lda <u002B get path to modem + cmpa #$03 is it legal? + lbls L12B3 no, return + ldx #u0C2E point to option buffer + ldb #SS.Opt set 'em + os9 I$SetStt + ldx #u0095 point to + ldd #$025A get CurXY codes + std ,x save 'em + ldb #$20 get Y co-ordinate + stb 2,x save it + ldy #3 get length + lda <u003E get path to status window + os9 I$Write position cursor for baud rate text + lda >u0CA5 get baud rate + anda #$07 keep only baud bits + ldb #5 get length of baud text entrys + mul calculate offset + leax L0652,pc point to baud rate text table + leax b,x point to baud rate + ldy #5 get length + lda <u003E get path to status line + os9 I$Write print current baud + ldb #$61 move X cursor position for word length + ldx #u0095 + stb 1,x + lda <u003E + ldy #$0003 + os9 I$Write + ldb >u0CA5 + bitb #$20 + bne L122D + ldb #'8 + bra L122F + +L122D ldb #'7 +L122F ldx #u0044 + stb ,x + ldy #1 + os9 I$Write + ldb #$63 + ldx #u0095 + stb 1,x + ldy #3 + lda <u003E + os9 I$Write + lda >u0CAC + anda #$E0 + cmpa #$A0 + bne L125D + leax L0991,pc point to 'Mark' + bra L127F go print it + +L125D cmpa #$E0 + bne L1267 + leax L0995,pc point to 'Space' + bra L127F go print it + +L1267 cmpa #$60 + bne L1271 + leax L099B,pc point to 'Even' + bra L127F go print it +L1271 cmpa #$20 + bne L127B + leax L09A0,pc point to 'Odd' + bra L127F go print it + +L127B leax L09A5,pc point to 'None' +L127F lda <u003E get path to status line + ldy #1 + os9 I$Write + ldb #$65 + ldx #u0095 + stb 1,x + lda <u003E + ldy #3 + os9 I$Write + ldb >u0CA5 + bpl L12A5 + ldb #'2 + bra L12A7 + +L12A5 ldb #'1 +L12A7 ldx #u0044 + stb ,x + ldy #1 + os9 I$Write +L12B3 puls d,x,y,pc + +* Setup path options for local keyboard to communicate with modems +* Entry: None +L12B5 pshs d,x,y + ldx #u13A9 point to a buffer + ldy #u0C0C point to original path options + ldb #$20 get size + lbsr L2D26 move it + ldx #u13A9 point to the buffer + clr PD.EKO-PD.OPT,x turn off echo + lda >u0CA8 + sta PD.ALF-PD.OPT,x save linefeed stat + clr PD.PAU-PD.OPT,x turn off pause + lda >u13A3 + sta PD.EOF-PD.OPT,x save EOF char + lda >u13A6 + sta PD.PSC-PD.OPT,x save pause char + lda >u13A4 + sta PD.INT-PD.OPT,x save interupt char + lda >u13A5 + sta PD.QUT-PD.OPT,x save quit char + ldd #1*256+SS.Opt Set the options + os9 I$SetStt + puls d,x,y,pc + +* Get current window settings +* +* Entry: None +L12F5 pshs d,x Preserve regs + ldd #SS.Opt Get option section path dsc. for Std In + ldx #u0C0C Buffer to hold option packet + os9 I$GetStt Get current option settings + lda PD.PAR-PD.OPT,x Get current parity (window type) + bpl L1348 If not a window, exit with error + ldd #1*256+SS.FBRgs Get fore/background/border regs from Std Out + os9 I$GetStt + std <u008D Save fore/background colors + tfr x,d Move border to splittable register + stb <u008F Save border color + ldx #u0C50 + ldd #1*256+SS.Palet Get current palette settings from Std Out + os9 I$GetStt Get current palette settings + ldd #1*256+SS.ScSiz Get screen size from Std Out + os9 I$GetStt Get current screen size + tfr x,d Move width to splittable register + stb <u0082 Save screen width + tfr y,d Move height to splittable register + stb <u0083 Save screen height + ldd #1*256+SS.ScTyp Get screen type from Std Out + os9 I$GetStt + sta <u0084 Save it + clrb No error & exit +L1346 puls pc,x,d + +L1348 comb Exit with Illegal Window Type error + ldb #$B7 + bra L1346 + +* Set local path options +* +* Entry: None +L134D pshs d,x Preserve regs + ldd #SS.Opt Set option section from Std In path + ldx #u0C0C Point to buffer holding new settings + os9 I$SetStt Set them + puls d,x,pc Restore regs & return + +L135C pshs y,x,d + leay >L0469,pc Point to main window DWEnd/DWSet + ldb #16 Copy 16 bytes (?) + ldx #u13A9 + lbsr L2D26 + ldx #u13A9 + lda <u0084 + sta 4,x + clra + sta 6,x + ldd <u0082 + std 7,x + ldd <u008D + std 9,x + lda <u008F + sta 11,x + ldy #12 # bytes to write + lda #$01 Write it out + os9 I$Write + ldx #u0C50 + ldd #1*256+SS.Palet Set palettes back to normal + os9 I$SetStt + ldd #$1B21 + std ,x + lda #$01 + ldy #$0002 + os9 I$Write + puls pc,y,x,d + +L13BA leax >L03A7,pc Inverse,Underline,Blink OFF/CLS + lbra L1B03 Will RTS from there + +* Add 1 to current cursor position (next line if needed) +L13CF pshs d + ldd >u0C94 get current position + inca add 1 to X + cmpa <u0090 past max? + bls L13E6 no, save & return + lda #1 reset it + incb add 1 to Y + cmpb <u0091 past max? + bls L13E6 no, save & return + decb bump it back +L13E6 std >u0C94 save new position + puls d,pc restore & return + +* Subtract 1 from current cursor position +L13EC pshs d + ldd >u0C94 get current cursor position + deca subtract 1 from X + bne L13FF minimum? + lda <u0090 yes, reset to end (will be on previous line) + decb take 1 off Y + bne L13FF minimum? + ldd #$0101 yes, reset +L13FF std >u0C94 save new position + puls d,pc restore & return + +L1405 clr >u0C94 reset X position + inc >u0C94 add 1 + rts + +* Bump Y coord to next line down +L140E pshs a Preserve reg we use + lda >u0C95 Get current Y coord + inca Bump up + cmpa <u0091 We past biggest Y coord allowable? + bls L141C No, save new one + deca Yes, bump it back a line +L141C sta >u0C95 Save new Y coord + puls pc,a Restore & return + +L1422 pshs d Preserve regs + ldd #$0101 Upper left corner of screen + std >u0C94 Save coords + puls pc,d Restore D & return + +L1433 pshs d + ldd >u0C94 + std >u0C96 + puls d + lbra L0D0F + +L1442 pshs d + lda #$02 + sta ,y+ + ldd >u0C96 + std >u0C94 + adda #$1F Bump X&Y coords to base $20 + addb #$1F + std ,y++ + ldb <u0C89 + addb #$03 + stb <u0C89 + puls d + lbra L0D0F + +L1467 pshs x,d + ldx #u0C60 + lda #$02 + sta ,y+ + lda 1,x + beq L1483 + cmpa #$FE + bne L147D + lda 2,x + beq L1483 +L147D cmpa <u0090 + bls L1485 +L1483 lda #$01 +L1485 sta >u0C94 + adda #$1F + sta ,y+ + lda ,x + beq L1497 + cmpa <u0091 + bls L1499 +L1497 lda #$01 +L1499 sta >u0C95 + adda #$1F + sta ,y+ + ldb <u0C89 + addb #$03 + stb <u0C89 + puls x,d + lbra L0D0F + +L14B0 pshs x,d + ldx #u0C60 + lda ,x + cmpa <u0090 + bhs L14C1 + tsta + bne L14C3 +L14C1 lda #$01 +L14C3 adda >u0C94 + cmpa <u0090 + bls L14D1 + lda <u0090 +L14D1 sta >u0C94 +L14D5 ldb #$02 + stb ,y+ + ldd >u0C94 + adda #$1F Bump up since base=$20 (both coords) + addb #$1F + std ,y++ Save new coords + ldb <u0C89 + addb #$03 + stb <u0C89 + puls x,d + lbra L0D0F + +L14F4 pshs x,d + ldx #u0C60 + lda ,x + cmpa <u0090 + bhs L1505 + tsta + bne L1507 +L1505 lda #$01 +L1507 sta >u0C84 + lda >u0C94 + suba >u0C84 + bgt L1517 + lda #$01 +L1517 sta >u0C94 + bra L14D5 + +L151D pshs x,d + ldx #u0C60 + lda ,x + cmpa <u0091 Fit within Y size of main window? + bhs L152E + tsta + bne L1530 +L152E lda #$01 +L1530 sta >u0C84 + lda >u0C95 + suba >u0C84 + bgt L1540 + lda #$01 +L1540 sta >u0C95 + bra L14D5 + +L1546 pshs x,d + ldx #u0C60 + lda ,x + cmpa <u0091 Y coord past size of window? + bhs L1557 Yes, force it to 1 + tsta Is it 0? + bne L1559 No, legit, skip ahead +L1557 lda #$01 Force size to 1 +L1559 adda >u0C95 + cmpa <u0091 + bls L1567 + lda <u0091 +L1567 sta >u0C95 + bra L14D5 + +L156E clra Std In + ldy #$0001 + ldx #u060E + os9 I$Read +* NOTE: SHOULD BE ABLE TO CHANGE SOME OF THE LDB <U0041/ANDB TO KEEP B +* AND USE BITB INSTEAD +L157B ldd #SS.KySns Get key sense data from Std In + os9 I$GetStt + sta <u0041 save key sense data + lda >u060E + clr >u060E + ldb >u0CA6 + cmpb #2 + lbeq L21F0 +* Check special command keys +L1597 cmpa #$1A download a file? (PgDn) + bne L15A5 no, check upload + ldb <u0041 get key sense info + andb #DOWNBIT is it down arrow? + beq L15A5 no, skip ahead + lbra L3580 process download + +L15A5 cmpa #$1C upload a file? (PgUp) + bne L15B3 no, check quit + ldb <u0041 get key sense info + andb #UPBIT is it up arrow? + beq L15B3 no, skip ahead + lbra L35DF process upload + +L15B3 cmpa #$F1 quit supercomm? (ALT-Q) + lbeq L1B0C yes, + cmpa #$E8 hangup modem? (ALT-H) + lbeq L1983 yes, + cmpa #$AF help? (ALT-?) + lbeq L110D + cmpa #$E1 autodial? (ALT-A) + lbeq L2EBF + cmpa #$E2 baud rate change? (ALT-B) + bne L15D2 + lbsr L1D2F +L15D2 cmpa #$E9 online timer toggle? (ALT-I) + bne L15D9 + lbra L175C + +L15D9 cmpa #$F4 change terminal type? (ALT-T) + bne L15E0 + lbsr L1E50 +L15E0 cmpa #$F5 update supercomm? (ALT-U) + bne L15E7 + lbsr L2E83 +L15E7 cmpa #$E3 clear screen? (ALT-C) + bne L15EE + lbsr L1EDC +L15EE cmpa #$85 transmit break? + bne L15F5 + lbsr L1D14 +L15F5 cmpa #$18 cntrl-X + bne L15FD no, + lda #$7F convert it to underscore (DELETE line on IBM's) + bra L1659 + +L15FD cmpa #$F2 reset palettes? + lbeq L16CB + cmpa #$F3 shell access? + lbeq L16DC + cmpa #$8A download #2? (ALT-DWN) + lbeq L3580 + cmpa #$8C upload #2? (ALT-UP) + lbeq L35DF + cmpa #$EF change options? (ALT-O) + bne L161C + lbsr L1F1D +L161C cmpa #$ED open/close buffer? (ALT-M) + bne L1623 + lbsr L2364 +L1623 cmpa #$E4 change directory? (ALT-D) + bne L162A + lbsr L22B1 +L162A cmpa #$FA conference mode? (ALT-Z) + bne L1631 + lbsr L2610 +L1631 ldb <u0041 get key sense data + andb #ALTERBIT is the ALT key down? + beq L1646 no, skip ahead + cmpa #$B1 + blo L1659 + cmpa #$B8 + bhi L1659 + lbsr L1A21 + lbra L0C5E + +L1646 cmpa #$B1 is it F1? + lbeq L110D yes, print help screen + cmpa #$18 + bne L1659 + ldb <u0041 + andb #LEFTBIT + beq L1659 + lda #$7F convert it to underscore (DELETE line on IBM's) +L1659 cmpa #$AF + bhi L16C8 + sta >u04EF + tst >u0CAA key click on? + beq L1675 no, skip ahead + ldd #1*256+SS.Tone Tone to Std Out + ldx #$2801 + ldy #$0900 + os9 I$SetStt +L1675 ldy #$0001 + ldx #u04EF + lda ,x + cmpa #C$CR + bne L168F + tst >u0CA9 + beq L168F + lda #$0A + sta 1,x + leay 1,y +L168F lda <u002B Get path to modem + os9 I$Write + tst >u04EF + bmi L16C8 + lda >u0CA7 + beq L16C8 + tst >u0CA8 + beq L16BB + lda >u04EF + cmpa #C$CR + bne L16BB + lda #$0A + sta >u04F0 + ldy #$0002 + bra L16BF + +L16BB ldy #$0001 +L16BF ldx #u04EF + lda #$01 + os9 I$Write +L16C8 lbra L0C5E + +* Reset palettes (ALT-R) +* Entry: None +L16CB pshs a,x,y preserve regs + leax L03D6,pc reset window codes + lbsr L1B03 + lbsr L1C57 set palettes per terminal type + puls a,x,y restore regs + lbra L0C5E go back to main loop + +* Shell Access (ALT-S) +L16DC pshs u preserve data area pointer + lbsr L134D reset path options + ldb #$13 + leay L03B2,pc point to overlay for shell + ldx #u13A9 point to buffer + lbsr L2D26 move 'em + ldx #u13A9 point to buffer + lda <u0090 get window X size + sta 5,x save it + lda <u0091 get Y size + tst <u0040 conference mode on? + beq L1703 no, skip ahead + suba #$03 take off size of conference window +L1703 sta 6,x save Y size + lda <u0089 get FColor + ldb <u0088 get BColor + std 7,x save 'em + lda #1 place overlay + ldy #9 + os9 I$Write + leau L02E5,pc point to parameters + leax L02E0,pc point to 'shell' + ldd #$1100 Type/Language & default data size + os9 F$Fork execute a shell + puls u restore data mem pointer + bcs L173D error, skip ahead + sta <u0076 save process # +L172D ldx #1 get # ticks + lbsr L0F56 sleep + os9 F$Wait wait for shell to die + bcs L173D error, skip ahead + cmpa <u0076 was it my shell? + bne L172D no, go back & wait +L173D lda #1 get path + leax L03C6,pc point to overlay end codes + ldy #2 get length + os9 I$Write get rid of overlay + lbsr L12B5 set path options back to me + lbra L0C5E go back to main loop + +L1750 lda ,x+ Keep copying until <SPACE> or size B is reached + sta ,y+ + cmpa #C$SPAC + beq L175B + decb + bne L1750 +L175B rts + +* Toggle On-Line timer (ALT-I) +L175C tst <u0072 VRN present? + beq L176C no, return to main loop + lda <u0075 currently active? + beq L176F no, turn it on + clr <u0075 turn it off + lbsr L0F20 print time +L176C lbra L0C5E return to main loop + +L176F inc <u0075 flag timer on + leax L0366,pc point to ASCII string '00:00:00' + ldy #u0077 point to buffer + ldb #$0B get length + lbsr L2D1E move it + ldx #u0077 point to buffer + ldy #$000B get length + lda <u003E get path to stat window + os9 I$Write print the time + lda <u0073 get current second from VRN + sta <u0074 save it into timer flag + lbra L0C5E return to main loop + +* External Zmodem file receive +L1793 ldd #$0802 get overlay start co-ordinates + std >u0C8F + ldd #$400A get overlay size + std >u0C91 + lbsr L1C81 place overlay + leax >L02F0,pc point to 'Zmodem file receive...' + lbsr L1B03 print it + leax >L048F,pc turn off cursor + lbsr L1B03 + ldx #u13A9 point to a buffer + ldd #1*256+SS.Opt Get path options for Std Out + os9 I$GetStt + ldx #u13A9 + ldd #$0100 SS.Opt for Std Out & settings below + sta $05,x + stb $07,x + os9 I$SetStt Set them + clra Duplicate window path + os9 I$Dup + sta <u006E + clra Close Std In path + os9 I$Close + lda <u002B get path to modem + os9 I$Dup + leau >L02E9,pc point to parameters for RZ + leax >L02E6,pc point to RZ + ldy #$000A get size of parameters + ldd #$1100 Type/Lang & default mem size + os9 F$Fork Call RZ + ldu #$0000 + pshs cc + sta <u0076 save process # + clra Restore Std In window path + os9 I$Close + lda <u006E + os9 I$Dup + lda <u006E get duplicate path + os9 I$Close close it + puls cc + bcs L1846 +L180E ldx #$0001 + lbsr L0F56 + ldd #$0001 SS.Ready from Std In + os9 I$GetStt + bcs L1836 No data ready, skip ahead + clra + tstb 0 bytes ready? + beq L1836 Yes, skip ahead + tfr d,y Transfer # bytes waiting to Y + ldx #u13A9 Point to buffer + os9 I$Read Get that many bytes + lda >u13A9 + cmpa #$05 + bne L1836 + lbsr L197B +L1836 os9 F$Wait + bcs L1846 + cmpa <u0076 + bne L180E + tstb + beq L1846 + lbsr L2AC5 +L1846 lbsr L1CDE + leax >L048B,pc + lbsr L1B03 + lbsr L12B5 + lbsr L1BAD + lbra L0C5E + +* Send file via ZModem +L1859 ldd #$0802 get overlay start co-ordinates + std >u0C8F save 'em + ldd #$400A get overlay size + std >u0C91 save 'em + lbsr L1C81 place overlay + leax L0322,pc point to 'External ZModem file send' + lbsr L1B03 print it + ldy #u070D point to parameter buffer + sty <u0048 save pointer to it + ldd #'-*256+'v Place -v in param buffer + std ,y++ + ldd #'v*256+C$SPAC Place 'v ' in param buffer + std ,y++ +L1887 leax L055F,pc point to 'File:' + pshs y + lbsr L1B03 print it + puls y + ldb #C$SPAC + lbsr L1B61 + tst <u0021 + lbne L1968 + ldx #u060E + ldb <u001D + cmpb #$01 + beq L18B6 +L18A9 lda ,x+ + sta ,y+ + decb + bne L18A9 + lda #C$SPAC + sta -1,y + bra L1887 + +* Filename to call ZModem send +L031F fcc 'sz' + fcb C$CR + +L18B6 lda #C$CR Append CR + sta ,y+ + tfr y,d + subd <u0048 + std <u0048 + cmpd #$0007 + lbcs L1968 + lbsr L1EDC + leax L048F,pc point to CurOff codes + lbsr L1B03 + ldx #u13A9 Point to buffer to hold Options + ldd #$0100 Get Options from Std Out path + os9 I$GetStt + ldd #$0100 SS.Opt from Std Out + ldx #u13A9 Point to buffer again + sta $05,x Auto line feed ON + stb $07,x Pause OFF + os9 I$SetStt Set new options + clra Dupe Std In path + os9 I$Dup + sta <u006E + clra Close Std In path + os9 I$Close + lda <u002B + os9 I$Dup + ldy <u0048 + ldu #u070D + leax <L031F,pc point to 'sz' + ldd #$1100 Type/Lang & default mem size + os9 F$Fork Fork SZ + pshs cc + sta <u0076 + clra Close Std In + os9 I$Close + lda <u006E + os9 I$Dup + lda <u006E + os9 I$Close + puls cc + bcs L1968 +L1930 ldx #$0001 + lbsr L0F56 + ldd #SS.Ready Data ready on Std In? + os9 I$GetStt + bcs L1958 + clra + tstb 0 bytes? + beq L1958 + tfr d,y Move # bytes ready to Y + ldx #u13A9 Point to buffer to hold them + os9 I$Read Read them in + lda >u13A9 + cmpa #$05 + bne L1958 + bsr L197B +L1958 os9 F$Wait + bcs L1968 + cmpa <u0076 + bne L1930 + tstb + beq L1968 + lbsr L2AC5 +L1968 lbsr L1CDE + lbsr L12B5 + leax L048B,pc + lbsr L1B03 + lbsr L1BAD + lbra L0C5E +* Kill SZ process +L197B lda <u0076 get it's process # + clrb get kill signal + os9 F$Send send it + rts return + +* Hangup modem (ALT-H) +L1983 tst <u0072 VRN present? + beq L198E no, skip ahead + clr <u0075 Flag that timer will be off + lbsr L0F20 +L198E ldd #$2105 + std >u0C8F + ldd #$0E03 + std >u0C91 + lbsr L1C81 + leax >L048F,pc + lbsr L1B03 + leax >L0349,pc + lbsr L1B03 + tst >u0CAB + bne L19E2 + tst <u001A + beq L19C8 + lda <u002B + ldb #SS.HngUp + os9 I$SetStt Hang up the phone + ldx #$003C + lbsr L0F56 + bra L1A0C + +* Hangup modem by '+++' 'ATH' +L19C8 ldx <u0011 + ldb 2,x + andb #$FE + stb 2,x + ldx #$003C + lbsr L0F56 + ldx <u0011 + ldb 2,x + orb #$01 + stb 2,x + bra L1A0C + +L19E2 lda <u002B + ldb #$03 +L19E7 leax >L0981,pc point to '+++' + ldy #$0001 + os9 I$Write + ldx #$000C + lbsr L0F56 + decb + bne L19E7 + ldx #$0080 + lbsr L0F56 + leax >L02DC,pc point to 'ATH' + ldy #$0004 + os9 I$Write +L1A0C lbsr L1CDE + leax >L048B,pc + lbsr L1B03 + lbra L0C5E + +L1A19 pshs y,x,d + ldx #u131C + bra L1A2E + +L1A21 pshs y,x,d + suba #$B1 + ldb #$80 + mul + ldx #u0D1C + leax d,x +L1A2E pshs x + clrb +L1A31 lda ,x+ + incb + cmpb #$80 Hi bit set char? + bhi L1A3C Yes, skip ahead + cmpa #C$CR Carriage return? + bne L1A31 +L1A3C decb + clra + puls x + tstb + beq L1A4F +L1A43 lda ,x+ + decb + cmpa #'\ + beq L1A5D + bsr L1A76 +L1A4C tstb + bne L1A43 +L1A4F puls pc,y,x,d + +L1A51 pshs x + ldx #$001E + lbsr L0F56 + puls x + bra L1A4C + +L1A5D lda ,x+ + decb + cmpa #'^ + beq L1A72 + cmpa #'* + beq L1A51 + cmpa #'\ + beq L1A6E + suba #$40 +L1A6E bsr L1A76 + bra L1A4C + +L1A72 lda #$1B <ESC>? + bra L1A6E + +* Write char in A to modem +L1A76 pshs y,x,a Preserve regs + leax ,s Point X to char to write + ldy #$0001 Write char out to modem + lda <u002B + os9 I$Write + puls pc,y,x,a Restore & return + +* Setup device windows +* Entry: None +L1A8A pshs a,x,y preserve + leay L0469,pc point to DWEnd,DWSet/Select for main window + ldx #u13A9 point to a buffer + ldb #14 get length of data + lbsr L2D26 move it + ldx #u13A9 Point to buffer again + lda #28 Maximum height we will try (for 28 line GRFDRV) + sta >u0C84 Save copy + sta 8,x Save in DWSet command + sta <u0091 Save as Y size of window (in case it works) + ldy #14 Size of all 3 commands + lda #1 Std Out + os9 I$Write Try it + bcs Nope No, try 27 down to 10 + lda 7,x Get width that worked + bra Worked Save it & return +Nope ldx #u13A9+2 point to data again (skipping DWEnd) + lda #27 Get screen height we will start trying on +L1AB5 sta >u0C84 Save copy + sta 6,x save it into DWSet + sta <u0091 Save as Y size of window + ldy #10 Size of DWSet command + lda #1 + os9 I$Write try to setup window + bcs L1AD8 didn't work, skip ahead + lda 5,x get width +Worked sta <u0090 Save it as main window width +L1AD6 puls a,x,y,pc restore & return + +L1AD8 lda >u0C84 get current height + deca subtract 1 + cmpa #10 do we have any room? + bhi L1AB5 yes, try again + comb set carry + ldb #E$IWDef Illegal Window Definition error + bra L1AD6 return with error + +L1AE8 leax L0467,pc Point to '/w' + lda #WRITE. + os9 I$Open Open path to new window + sta <u003E Save it + leax >L0477,pc Point to DWSet for status line window + ldy #$000A + os9 I$Write + rts + +* Generic WRITE routine +L1B03 lda #$01 Std out path +L1B05 ldy ,x++ Get length to write + os9 I$Write Write it out + rts + +* NOTE: SHOULD MOVE THESE ROUTINES? +L1B0C bsr L1B1D + cmpa #'y + lbeq L0EEF + cmpa #'Y + lbeq L0EEF + lbra L0C5E + +L1B1D pshs y + ldd #$1D04 + std >u0C8F + ldd #$1603 + std >u0C91 + lbsr L1C81 + leax >L0499,pc + bsr L1B03 + leax >L048F,pc + bsr L1B03 + lbsr L2ABC + pshs a + leax >L048B,pc + bsr L1B03 + lbsr L1CDE + puls pc,y,a + +L1B4E pshs x,b + ldx #u0C99 + os9 F$Time + lda $05,x Get seconds + ldx #$0002 Sleep for 2 tics + os9 F$Sleep + puls pc,x,b + +* Get input string locally +* Entry: B=Count? +L1B61 pshs d,x,y + clr <u001C + clr <u001D clear input data count + clr <u0021 break flag? + ldx #u060E +L1B70 lbsr L2ABC + cmpa #'- is it printable? + bls L1B85 no, check control chars. + tstb + beq L1B70 + sta ,x+ save data to buffer + decb decrement count + inc <u001D add 1 to data length + lbsr L1F0B go print it + bra L1B70 go try again + +L1B85 cmpa #C$BSP was it backspace? + bne L1B99 no, + tst <u001D any data? + beq L1B70 no, try again + incb + dec <u001D decrement count + leax -1,x backup + lbsr L1F0B print it + bra L1B70 go try again + +L1B99 cmpa #C$QUIT break? + bne L1BA2 no, check CR + inc <u0021 flag break + puls d,x,y,pc Restore & return + +L1BA2 cmpa #C$CR carriage return? + bne L1B70 no, try again + sta ,x save it + inc <u001D add 1 to count + puls d,x,y,pc restore & return + +L1BAD ldd #SS.Ready Std In - Check for data ready + os9 I$GetStt + bcc L1BB7 May have some, skip ahead + rts Otherwise, return + +L1BB7 tstb 0 bytes? + beq L1BC6 Yes, skip ahead + clra Clear high byte of size & Std In + tfr d,y Move to Y for Read call + ldx #u13A9 Place to hold waiting data + os9 I$Read +L1BC6 rts + +* <ALT>-<1-8> function key init routine +L1BC7 pshs x,d + ldb #$08 # function keys to init + ldx #u0D1C Point to start of <ALT>-<1> key buffer + lda #C$CR +L1BD1 sta ,x Save 2 CR's as default for each key + sta 1,x + leax >$0080,x Move to next key + decb Do until all function keys initialized + bne L1BD1 + puls pc,x,d + +* TAB HANDLER GOES HERE (CHR$(9)) +* L1BDE rts + +L1BDF lda <u0065 Get monitor type (0=Comp, 1=RGB, 2=Mono) + cmpa #2 + bne L1BEC If comp or RGB, skip ahead + leay >L0371,pc Point to a set of palettes for monochrome + bra L1C16 + +* Monitor type is color (comp or RGB) +L1BEC tst >u0CA6 Check current terminal type + bne L1C12 If Not TTY, skip ahead +* TTY: Color + leay >L0391,pc Point to OS9 terminal type palette defaults + ldd #$0601 Reset some stored colors + std <u0085 + ldd #$0002 + std <u0087 + ldd #$0704 + std <u0089 + ldd #$0305 + std <u008B + bra L1C30 + +* OS9 or ANSI +L1C12 leay >L0381,pc Point to ANSI terminal type palette defaults +L1C16 ldd #$0504 + std <u0085 + ldd #$0700 + std <u0087 + ldd #$0601 + std <u0089 + ldd #$0203 + std <u008B +L1C30 ldx #u13A9 Point to temp buffer + ldd #$1B31 Set palette command + std ,x + clra Start with palette 0 +L1C3A ldb a,y + pshs y,a + std $02,x + ldy #$0004 + lda #$01 + os9 I$Write + puls y,a + inca + cmpa #$10 + blo L1C3A + lbsr L2C18 + lbra L2B86 + +L1C57 pshs x,a + lda <u0065 + cmpa #$02 + beq L1C6C + tst >u0CA6 + bne L1C6C + leax >L03A4,pc + bra L1C70 + +L1C6C leax >L03A1,pc +L1C70 lda ,x + lbsr L2347 + lda $01,x + lbsr L233B + lda $02,x + lbsr L2341 + puls pc,x,a + +* Generic shadowed overlay window set routine +* Uses 9 byte buffer from u13A9 to hold OWSet command +* u0C8F : Start X,Y coords +* u0C91 : X,Y width +L1C81 pshs y,x,d Preserve regs + ldx #u13A9 Point to buffer + ldd #$1B22 OWSet prefix (Draw shadow part of overlay) + std ,x + lda #$01 Save switch on + sta 2,x + ldd >u0C8F Get start coords + adda #$01 Bump up by 1 + addb #$01 + std 3,x Save in string + ldd >u0C91 Get width & height + std 5,x Save in string + ldb >u0085 Get bckground color + clra Foreground color=0 + std 7,x Save in string + lda #$01 Pop overlay window onto screen + ldy #$0009 + os9 I$Write + ldd #$1B22 Now, draw main overlay window + std ,x + lda #$01 + sta $02,x + ldd >u0C8F + std 3,x + ldd >u0C91 + std 5,x + lda <u0087 + ldb <u0086 + std 7,x + lda #$0C + sta $09,x + lda #$01 + ldy #$000A + os9 I$Write + puls pc,y,x,d + +* Generic shadowed overlay window remove routine +L1CDE pshs y,x,d Preserve regs + ldx #u13A9 Point to buffer + ldd #$1B23 OWEnd command + std ,x + lda #1 Take off both main & shadow overlays + ldy #$0002 + os9 I$Write + os9 I$Write + puls pc,y,x,d Restore & return + +L1CF7 pshs y,x,d + ldx #$1003 + ldy #$0EA0 +L1D00 ldd #1*256+SS.Tone Tone to Std Out + os9 I$SetStt + puls pc,y,x,d + +L1D09 pshs y,x,d + ldx #$3F03 + ldy #$0FD1 + bra L1D00 + +L1D14 pshs x,d + ldb #SS.Break Send a BREAK signal + lda <u002B Get modem path + os9 I$SetStt Send BREAK to modem + bcc L1D2D Did it, return without error + ldx <u0011 If modem Driver doesn't support SS.Break call, + lda 2,x force it on hardware (assumes 6551 card) + ora #%00001100 + sta 2,x + anda <u00F3 + sta 2,x +L1D2D puls pc,x,d + +L063D fdb 19 # bytes this message + fcb C$LF,C$CR + fcc ' Baud Rate: ' + +* 12 backspaces +L03CA fcb C$BSP,C$BSP,C$BSP,C$BSP,C$BSP,C$BSP + fcb C$BSP,C$BSP,C$BSP,C$BSP,C$BSP,C$BSP + +L0652 fcc '110 ' + fcc '300 ' + fcc '600 ' + fcc '1200 ' + fcc '2400 ' + fcc '4800 ' + fcc '9600 ' + fcc '19200' + +* <ALT>-<B> Baud rate +L1D2F pshs y,x,d + leax >L048F,pc Cursor OFF + lbsr L1B03 + ldd #$1E03 Set start coords & size of overlay window + std >u0C8F + ldd #$1203 + std >u0C91 + lbsr L1C81 Put shadowed overlay on screen + leax <L063D,pc Print 'Baud Rate:' + lbsr L1B03 + ldb >u0CA5 Get word len/stop bits/baud rate + andb #%00000111 Just want baud rate +L1D56 stb >u0C84 Save baud rate + leax <L03CA,pc Point to 10 C$BSP's + ldy #$0005 Send out 5 backspaces??? + lda #1 + os9 I$Write + leax <L0652,pc Point to baud rate table + lda #$05 Point to current baud rate string + ldb >u0C84 + mul + leax d,x + lda #$01 Write it out + ldy #$0005 + os9 I$Write +L1D7D lbsr L2ABC ??? + cmpa #C$CR Carriage return? + beq L1D9B Yes, skip ahead + cmpa #$05 <CTRL>-<E> (BREAK)? + beq L1D9B Yes, skip ahead + cmpa #C$SPAC <SPACE> (next baud)? + bne L1D7D No, go get another key since current is illegal + ldb >u0C84 Get baud rate + incb Bump up to next one + cmpb #8 Wrap past 19200? + bne L1D56 No, go update baud rate on screen + clrb Reset baud to 110 + bra L1D56 Go update baud rate on screen + +L1D9B ldb >u0CA5 Get stop bits/word len/baud rate + andb #%11111000 Mask out the baud rate + orb >u0C84 Merge new baud rate + stb >u0CA5 Save as new setting + lbsr L1CDE Remove overlay windows + lbsr L118F Update port settings & status line + leax >L048B,pc Turn cursor ON + lbsr L1B03 + puls pc,y,x,d Restore & return + +* ==> Menu handler +* Entry: B=current menu # (0 base) selected +* u0C84 : current menu # selected +* u139E : Max. # items on menu +L1DB8 pshs y,x,a Preserve regs + clr >u0099 + stb >u0C84 Save current menu item # selected + ldx #u13A9 Point to temp buffer + ldd #$1B25 CWArea prefix + std ,x Save it + ldd #$0102 Start X,Y = 1,2 + std 2,x + lda #$04 Width=4 + ldb >u139E Height=# entries in menu (0 base) + incb +1 + std 4,x Save it + lda #$01 Change working area of window + ldy #$0006 + os9 I$Write + ldb >u0C84 Get B back +L1DE6 clra D=B+1 + incb + tfr d,y Move to Y + leax >L0688,pc Clear working area & print Y # line feeds + inca A=1 (Std Out) + os9 I$Write + leax >L0693,pc Point to '==>' cursor + ldy #$0003 Write that out + os9 I$Write +L1DFE lbsr L2AC5 Go get key + anda #$7F Mask out high bit + cmpa #C$LF Down arrow? + beq L1E19 Yes, skip ahead + cmpa #C$FORM Up arrow? + beq L1E2B Yes, skip ahead + cmpa #C$SPAC Space bar? + beq L1E39 Yes, get menu item selected & exit + cmpa #$05 <CTRL>-<E> or <BREAK>? + beq L1E3F + cmpa #C$CR Carriage return? + bne L1DFE No, other keys illegal: go get another key +L1E4A inc <u0099 Flag that a change was made? +L1E39 ldb >u0C84 Get menu item # selected + puls pc,y,x,a Restore regs & return + +* Down arrow in ==> menu +L1E19 ldb >u0C84 Get current menu # + incb Bump up + cmpb >u139E Past maximum + blo L1E25 No, skip ahead + clrb Reset to menu item #0 +L1E25 stb >u0C84 Save new menu item selected + bra L1DE6 Update menu arrow & get next key + +* Up arrow in ==> menu +L1E2B ldb >u0C84 Get current menu # + decb Bump down + bpl L1E25 If still legit, save it & update menu arrow + ldb >u139E Get # items in menu + decb Make base 0 + bra L1E25 Save & update menu arrow + +* <CTRL>-<E> / <BREAK> +L1E3F ldb >u139E Get # items in menu + incb +1 (to flag cancel?) + stb >u0C84 Save as current menu item selected + puls pc,y,x,a Restore & return + +* Select terminal type (<ALT>-<T>) +L1E50 pshs y,x,d Preserve regs + leax >L048F,pc Cursor OFF + lbsr L1B03 + ldd #$1C03 Set up shadowed overlay window 23x3 + std >u0C8F + ldd #$1703 + std >u0C91 + lbsr L1C81 + leax >L0696,pc 'Terminal type' + lbsr L1B03 + ldb >u0CA6 Get current terminal type +L1E75 stb >u0C84 Save as # entries in menu + leax >L03CA,pc Point to Backspaces + lda #$01 Blank out 5 chars + ldy #$0005 + os9 I$Write + leax >L06B0,pc Point to terminal type table + lda #$05 Calculate offset to currently selected type + ldb >u0C84 + mul + leax d,x + ldy #$0005 Print it out + lda #$01 + os9 I$Write +L1E9C lbsr L2ABC Go get keypress + cmpa #C$CR Carriage return (keep new setting)? + beq L1EBA Yes, go process + cmpa #$05 <CTRL>-<E> or <BREAK>? + beq L1EBA Yes, go process + cmpa #C$SPAC <SPACE> (change setting)? + bne L1E9C No, illegal key, try again + ldb >u0C84 Get terminal type + incb Bump up to next one + cmpb #3 Past maximum? + bne L1E75 No, go print new selection & back to menu handler + clrb Reset to 1st & back to menu handler + bra L1E75 + +L1EBA ldb >u0C84 Get selected terminal type + stb >u0CA6 Save as new terminal type + lbsr L1BDF Go reset palettes for new terminal type + lbsr L1CDE Remove overlay windows + lbsr L1C57 Go set fore/back/border colors + bsr L1EDC Go clear the screen + tst <u0040 Is conference mode active? + beq L1ED3 No, skip ahead + bsr L1EE5 Yes, reset up conference mode window +L1ED3 leax >L048B,pc Cursor ON + lbsr L1B03 + puls pc,y,x,d Restore & return + +* Clear screen +L1EDC pshs a Preserve A + lda #C$FORM Clear screen code + bsr L1F0B Write it out + puls pc,a Restore & return + +* Setup conference mode again +L1EE5 pshs y,x,d Preserve regs + ldx #u13A9 Point to buffer + ldd #$1B25 CWArea prefix + std ,x + ldd #$0000 Start @ 0,0 + std 2,x + ldd #$5003 80x3 size + std 4,x + lda #1 Home Cursor + sta 6,x + ldy #$0007 Send CWArea/Home cursor to conference window + lda <u003F + os9 I$Write + lbra L268D Go print '---'... line etc. for conference mode + +* Print char in A to Std Out +L1F0B pshs y,x,d Preserve regs & char to print + leax ,s Point to char + ldy #$0001 Write it out + lda #$01 + os9 I$Write + puls pc,y,x,d Restore & return + +* <ALT>-<O> Options menu +L1F1D pshs y,x,d Preserve regs + leax L048F,pc Cursor OFF + lbsr L1B03 + ldd #$1F03 Do shadowed overlay of 31x3 + std >u0C8F + ldd #$160E + std >u0C91 + lbsr L1C81 + leax L0821,pc Print out Options menu + lbsr L1B03 + lbsr L20DB Print Echo status + lbsr L2108 Print Rx LF status + lbsr L2118 Print Tx LF status + lbsr L20F8 Print Key click status + lbsr L21D5 Print Word Length setting + lbsr L2174 Print Parity setting + lbsr L21B9 Print Stop bits setting + lbsr L2128 Print Host Echo setting + lbsr L2138 Print Hangup type setting + lbsr L2148 Print Auto-Zmodem setting + lbsr L2158 Print Auto-ASCII setting + lda #$0B Get # items on menu + sta >u139E Save for ==> menu handler + clrb Default to menu item #0 +L1F66 lbsr L1DB8 Go get menu selection + ldx #u13A9 + ldd #$1B25 CWArea + std ,x + ldd #$0000 from 0,0 + std 2,x + ldd #$160E to 22,14 (on overlay window) + std 4,x + ldy #$0006 + lda #$01 + os9 I$Write + tst <u0099 Any entry change? + lbne L20CF No, remove Options menu & return + ldb >u0C84 Get menu item # that was changed + cmpb #$0A Was it <CTRL>-<E>/BREAK (1 higher than max)? + lbhi L20CF Yes, remove Options menu & return + tstb Was it Echo status? + bne L1FAB No, try next + lda >u0CA7 Get echo type + bne L1FA7 If 1, change to 0 + inc >u0CA7 If 0, change to 1 + bra L1FAB + +L1FA7 clr >u0CA7 +L1FAB lbsr L20DB Print setting (0=Off, 1=On) + cmpb #$03 + bne L1FC2 + lda >u0CAA + bne L1FBE + inc >u0CAA + bra L1FC2 + +L1FBE clr >u0CAA +L1FC2 lbsr L20F8 + cmpb #$07 + bne L1FD9 + lda >u0CB1 + bne L1FD5 + inc >u0CB1 + bra L1FD9 + +L1FD5 clr >u0CB1 +L1FD9 lbsr L2128 + lbsr L118F + cmpb #$05 + bne L200C + lda >u0CAC + anda #$E0 + tsta + beq L2011 + cmpa #$E0 + beq L2015 + adda #$40 +L1FF3 pshs b + ldb >u0CAC + andb #$1F + stb >u0CAC + puls b + ora >u0CAC + sta >u0CAC + lbsr L118F +L200C lbsr L2174 + bra L2018 + +L2011 adda #$20 + bra L1FF3 + +L2015 clra + bra L1FF3 + +L2018 cmpb #$06 + bne L2032 + lda >u0CA5 + bpl L2026 + anda #$7F + bra L2028 + +L2026 ora #$80 +L2028 sta >u0CA5 + lbsr L118F + lbsr L21B9 +L2032 cmpb #$04 + bne L204E + lda >u0CA5 + bita #$20 + beq L2042 + anda #$DF + bra L2044 + +L2042 ora #$20 +L2044 sta >u0CA5 + lbsr L118F + lbsr L21D5 +L204E cmpb #$01 + bne L2062 + lda >u0CA8 + bne L205E + inc >u0CA8 + bra L2062 + +L205E clr >u0CA8 +L2062 lbsr L2108 + cmpb #$02 + bne L207C + lda >u0CA9 + bne L2075 + inc >u0CA9 + bra L207C + +L2075 clr >u0CA9 + lbsr L118F +L207C lbsr L2118 + cmpb #$08 + bne L2093 + tst >u0CAB + bne L208F + inc >u0CAB + bra L2093 + +L208F clr >u0CAB +L2093 lbsr L2158 + cmpb #$09 + bne L20AA + tst >u0CAE + bne L20A6 + inc >u0CAE + bra L20AA + +L20A6 clr >u0CAE +L20AA lbsr L2148 + cmpb #$0A + bne L20C1 + tst >u0CAD + bne L20BD + inc >u0CAD + bra L20C1 + +L20BD clr >u0CAD +L20C1 bsr L2138 + cmpb #$0A + bhi L20CF + ldb >u0C84 + lbra L1F66 + +L20CF lbsr L1CDE Turn off overlay windows + leax >L048B,pc Point to Cursor On + lbsr L1B03 Print it + puls pc,y,x,d Restore regs & return + +L20DB pshs x,d + ldd #$1102 + lbsr L2294 + lda >u0CA7 +L20E7 bne L20F2 +L20E9 leax >L0985,pc Point to word 'Off' +L20ED lbsr L1B03 Print it + puls pc,x,d + +L20F2 leax >L098B,pc Point to word 'On' + bra L20ED + +L20F8 pshs x,d + ldd #$1105 + lbsr L2294 + lda >u0CAA + bra L20E7 Go print 'on' or 'off' + +L2108 pshs x,d + ldd #$1103 + lbsr L2294 + lda >u0CA8 + bra L20E7 Go print 'on' or 'off' + +L2118 pshs x,d + ldd #$1104 + lbsr L2294 + lda >u0CA9 + bra L20E7 Go print 'on' or 'off' + +L2128 pshs x,d + ldd #$1109 + lbsr L2294 + lda >u0CB1 + bra L20E7 Go print 'on' or 'off' + +L2138 pshs x,d + ldd #$110C + lbsr L2294 + lda >u0CAD + bra L20E7 Go print 'on' or 'off' + +L2148 pshs x,d Preserve regs + ldd #$110B CurXY to 17,11 in options window + lbsr L2294 + lda >u0CAE Get Auto-ZModem flag (0=yes) + deca Adjust flag so routine works + bra L20E7 Go print 'on' or 'off' + +L2158 pshs x,d + ldd #$110A + lbsr L2294 + lda >u0CAB Get current hangup method + bne L216D <>0 is +++ + leax >L0979,pc Point to 'dtr' + bra L20ED + +L097F fdb 4 # bytes this message +L0981 fcc '+++' + fcb 4 (Clear to EOL) + +L216D leax <L097F,pc Point to '+++' + bra L20ED + +L2174 pshs y,x,d + ldd #$1007 + lbsr L2294 + lda >u0CAC + anda #$E0 + cmpa #$A0 + bne L218C + leax >L0990,pc Point to 'Mark' + bra L21AE + +L218C cmpa #$E0 + bne L2196 + leax >L0995,pc Point to 'Space' + bra L21AE + +L2196 cmpa #$60 + bne L21A0 + leax >L099A,pc Point to 'Even' + bra L21AE + +L21A0 cmpa #$20 + bne L21AA + leax >L099F,pc Point to 'Odd' + bra L21AE + +L21AA leax >L09A4,pc Point to 'None' +L21AE lda #$01 Std Out + ldy #$0005 Size of parity string + os9 I$Write Print it out + puls pc,y,x,d + +* Print current Stop bits setting +L21B9 pshs x,d + ldd #$1208 Go position cursor @ 18,8 + lbsr L2294 + lda >u0CA5 Get # stop bits (hi bit) + bpl L21CE + lda #'2 + bra L21D0 + +L21CE lda #'1 +L21D0 lbsr L1F0B + puls pc,x,d + +* Print current Word Length setting +L21D5 pshs x,d + ldd #$1206 Position cursor @ 18,6 + lbsr L2294 + lda >u0CA5 Get word length + bita #$20 + bne L21E9 + lda #'8 + bra L21EB + +L21E9 lda #'7 +L21EB lbsr L1F0B + puls pc,x,d + +L21F0 cmpa #$8C <ALT>-<up arrow>? + bne L21F8 + ldd #'A*256+9 ANSI/OS9 cursor up codes + bra L2239 + +L21F8 cmpa #$8A <ALT>-<down arrow>? + bne L2200 + ldd #'B*256+$A ANSI/OS9 cursor down codes + bra L2239 + +L2200 cmpa #$88 <ALT>-<left arrow>? + bne L2208 + ldd #'D*256+8 ANSI/OS9 cursor left code + bra L2239 + +L2208 cmpa #$89 <ALT>-<right arrow>? + bne L2210 + ldd #'C*256+6 ANSI/OS9 cursor right code + bra L2239 + +L2210 ldb <u0041 Get last key sense byte + bitb #%01111000 Any of the arrows? + lbeq L1597 No, go check special SuperComm keys + cmpa #$13 <CTRL>-<up>? + bne L2221 No, skip ahead + ldd #'H*256+1 ANSI/OS9 Home cursor codes + bra L2239 + +L2221 cmpa #$12 <CTRL>-<down>? + bne L2229 + ldd #'K*256 ANSI end (screen or line?) / No OS9 + bra L2239 + +L2229 cmpa #$10 <CTRL>-<left>? + bne L2231 + ldd #'P*256 ANSI delete char / No OS9 + bra L2239 + +L2231 cmpa #$11 <CTRL>-<right>? + lbne L1597 No, go check for SuperComm special keys + ldd #'@*256 ANSI insert char / No OS9 +L2239 ldx #u04EF Point to buffer for 3 byte ANSI sequence + sta 2,x Save as ANSI post byte + pshs b Save OS9 code until ANSI sequence sent + ldd #$1B5B ANSI prefix: <ESC>[ + std ,x + lda <u002B Get path to modem + ldy #$0003 + os9 I$Write Send out the ANSI sequence + tst >u0CA7 ??? Check if we have to do local cursor change + lbeq L0C5E No, go back to main processing loop + ldb ,s+ Get OS9 code back + lbeq L0C5E None, return to main processing loop + stb ,x Save it in buffer + lda #1 Std Out (screen) + ldy #$0001 + os9 I$Write Write out OS9 code + lbra L0C5E Return to main processing loop + +* Position cursor at A,B +L2294 pshs y,x,d Preserve regs + ldx #u0095 Point to buffer area + adda #$20 Bump cursor pos. to OS9 equivalent (+$20) + addb #$20 + std $01,x Save OS9 coords + lda #$02 CurXY prefix + sta ,x Save that too + deca A=1 (Std Out) + ldy #$0003 Size of CurXY command + os9 I$Write Position cursor + puls pc,y,x,d Restore regs & return + +* Change Data Directory command +L22B1 pshs y,x,d + ldd #$1504 Place overlay window from 21,4 to 58,11 + std >u0C8F + ldd #$2507 + std >u0C91 + lbsr L1C81 + leax >L051C,pc Point to 'break aborts' + lbsr L1B03 + ldd #$0102 Position cursor @ 1,2 + bsr L2294 + lda #$01 + ldx #u0CD2 Point to current data dir + ldy #$0020 + os9 I$WritLn + ldb #$1F + leax >L09A9,pc Point to 'change data dir' message + lbsr L1B03 + lbsr L1B61 + tst <u0021 + bne L230E + lda >u060E Get first char that user typed in + cmpa #C$CR If just CR, skip ahead + beq L230E + lda #READ. ChgDir in read mode + ldx #u060E Point to user-typed directory path + os9 I$ChgDir Change to it + bcs L2313 Error, skip ahead + ldx #u060E Did it, copy user path list to default path list + ldy #u0CD2 + ldb #$20 + lbsr L2D1E Copy data +L230E lbsr L1CDE Overlay Window end + puls pc,y,x,d Restore & return + +* Print error message to user +L2313 lda #C$BELL Beep at user + lbsr L1F0B + pshs b + ldd #$0D02 CurXY @ 13,2 + lbsr L2294 + leax >L048F,pc Cursor OFF + lbsr L1B03 + puls b + os9 F$PErr Print error message + ldx #60 + lbsr L0F56 ??? (something with Timer) + leax >L048B,pc Cursor ON + lbsr L1B03 + bra L230E Overlay window end & return + +* Change background color to A +L233B pshs y,x,d Preserve regs + ldb #$33 Background color code + bra L234B + +* Change border color to A +L2341 pshs y,x,d Preserve regs + ldb #$34 Border color code + bra L234B + +* Change foreground color to A +L2347 pshs y,x,d Preserve regs + ldb #$32 Foreground color code +L234B ldx #u13A9 Point to temp buffer + sta 2,x Save palette # + lda #$1B OS9 window code prefix + std ,x Save it + lda #1 Std Out + ldy #$0003 Change appropriate color, restore regs & return + os9 I$Write + puls pc,y,x,d + +L2364 tst <u0026 ASCII receive buffer open? + beq L2372 No, go check if a receive file exists + clr <u0026 Yes, set receive buffer to CLOSED state + bra L237E Will return from there + +L2372 tst <u0025 ASCII receive file exist? + bne L2376 Yes, go flag buffer as open + rts + +L2376 inc <u0026 Set ASCII receive buffer to OPEN state +* Change buffer indicator on status line to OFF +L237E pshs y,x,d Preserve regs + tst <u0026 Get ASCII buffer open/closed flag + bne L23AA Open, skip ahead + leay >L096D,pc Point to buffer close string (for status line) + ldx #u13A9 + ldb #12 Copy it + lbsr L2D26 + ldx #u13A9 Get ptr back + lda <u0088 Get bckground color of main window + sta $07,x Save new color in string + lda <u0087 Get foreground color of main window + sta $0B,x Save new color in string + lda <u003E Get path to status line window + lbsr L1B05 +L23A8 puls pc,y,x,d + +* Change buffer indicator on status line to ON +L23AA leay >L0960,pc Point to buffer on string (for status line) + ldx #u13A9 + ldb #13 + lbsr L2D26 + ldx #u13A9 + lda <u0087 + sta $09,x + lda <u003E + lbsr L1B05 + lda <u0002 + suba <u0006 + lbsr L44FF + puls pc,y,x,d Restore & return + +* Position cursor @ X coord on line 1 to center text @ [u0093] within 40 chars +L23D0 pshs y,x,d Preserve regs + ldx <u0093 Get ptr to ??? + clrb Clear counter +* Count # chars (max 30) until high bit set or '.' found +L23D7 lda ,x+ Get char + incb Inc counter + cmpb #30 Up to 30 char max? + bhi L23E5 Yes, skip ahead + tsta Does the char have the high bit set? + bmi L23E5 Yes, skip ahead + cmpa #'. Is it a period? + bne L23D7 No, get next char +L23E5 addb #8 Add 8 to total # chars (8 spaces assumed) + ldx #u13A9 Point to temp buffer + pshs b Preserve count + lda #40 Centering within 40 chars + suba ,s+ A=40-B (size) + lsra Divide by 2 (calculate # chars in to center?) + adda #$21 Add to base for Cursor coords+1 + sta 1,x Save coord + ldd #$0221 CurXY prefix & Y coord=1 + stb 2,x Save Y coord + sta ,x Save CurXY prefix + ldy #$0003 Move cursor to X + lda #1 Std Out + os9 I$Write Position cursor & return + puls pc,y,x,d + +L2408 pshs y,x,d Preserve regs + ldd <u0053 Get ptr + beq L246F None, skip ahead + +L2411 ldx #u00E2 Point to buffer + ldy <u0057 Get # bytes to read + lda <u0042 Get path to download file + os9 I$Read Go read from file + bcc L242A No error on read, continue + ldd #$0000 + inc <u005F + bra L2432 + +L242A cmpy <u0057 + beq L2449 +L2430 tfr y,d Copy # bytes read to D +L2432 ldx #u00E2 Point to 3 bytes into modem buffer + leax d,x Offset into it + pshs d Preserve offset + ldd <u0057 Get # bytes read + subd ,s++ Subtract ??? + tfr d,y Move result to Y + lda #$1A <CTRL>-<Z> for X/Ymodem padding to even block +L2443 sta ,x+ + leay -1,y + bne L2443 + +L2449 ldx #u00DF Point to modem buffer + ldd <u0053 + stb 1,x + comb + stb 2,x + ldd <u0053 + beq L2463 + ldd <u0057 + cmpd #$0080 + bne L2469 +L2463 lda #$01 + sta ,x + bra L246D + +L2469 lda #$02 + sta ,x +L246D puls pc,y,x,d + +L246F tst <u0069 + beq L2481 + ldx #u00E2 + ldd #$0080 +L247A sta ,x+ + decb + bne L247A + bra L2449 + +L2481 ldx #u00E2 + ldy #u009F + ldb #32 32 chars max +L248B lda ,y+ + beq L2498 If NUL, skip ahead + cmpa #C$CR If CR, skip ahead + beq L2498 + sta ,x+ + decb + bne L248B +L2498 clr ,x+ + lbsr L2C72 + bra L2449 + +L249F pshs y,x,d + clr <u0048 + clr <u0049 + ldx #u00E2 + ldd <u0057 + leay d,x + sty <u0050 + tst <u005A + bne L24C5 + lbsr L3E3D + leax d,x + lda <u0048 + sta ,x +L24C3 puls pc,y,x,d + +L24C5 lbsr L3E0F + leax d,x + ldd <u0048 + std ,x + bra L24C3 + +* Clear out 512 bytes @ u111C - Clears out Search (SSn) and Reply (RSn) +* strings +L24D1 pshs y,x,a Preserve regs + ldy #u111C Point to 512 byte buffer to clear + ldx #$0000 double clear word + clra Double count=256 +L24DB stx ,y++ Clear 2 bytes + deca Done all 256 double bytes? + bne L24DB No, continue clearing + puls pc,y,x,a Restore & return + +* Search (SSn) string parse +L24E3 lda -2,x + suba #$31 Convert ASCII numeral (1 based) to bin (0 base) + cmpa #3 Within range of 0-3? + bhi L2541 No, exit + ldb #$40 Size of each entry=64 bytes + mul Point to appropriate entry + ldy #u121C Point to main buffer + leay d,y Point to entry within buffer + ldb #$40 Max size to copy +L24F6 lda ,x+ Get char + decb drop count + beq ForceCR If done max count, force CR on end + cmpa #C$CR Is it a CR? + beq L2504 Yes, save it and stop + sta ,y+ Save char + bra L24F6 Keep copying + +ForceCR lda #C$CR Done, force last char to CR +L2504 sta ,y Save last char + puls pc,y,x,d Restore & return + +* Send string parse (SSn) - does CTRL (\) conversions +L2508 lda -$02,x + suba #$31 + cmpa #$03 + bhi L2541 + ldb #$40 + mul + ldy #u111C Point to send string buffer + leay d,y + lda #$01 + sta <u0C82 + pshs x + ldx #u111C + stx >u139C + puls x + ldb #$40 Get max size of Send string +L252D lda ,x+ Copy until CR or 64 chars is hit + cmpa #C$CR + beq L253E + cmpa #'\ Control code? + beq L2544 Yes, process for that +L2537 sta ,y+ + decb + bne L252D + puls pc,y,x,d +L253E clrb + stb ,y +L2541 puls pc,y,x,d + +L2544 lda ,x+ Get code + suba #$40 Knock down to <CTRL> equivalent + bra L2537 Save & continue + +* Entry: X=Ptr to converted text buffer? +L254A pshs y,x,d Preserve regs + ldb <u0C89 Get size of converted text buffer + ldy >u139C Get ptr to ??? +L2555 lda ,x+ Get char + anda #$7F Strip high bit + decb Drop count in buffer + clr <u0071 Clear flag +L255D cmpa ,y Same as first char in search string buffer? + beq L258A Yes, skip ahead + lda <u0C82 Get reply string # + deca bump to 0 base (0-3) + pshs b + ldb #$40 Size of search strings + mul + ldy #u111C Point to search strings + leay d,y Point to one we want + sty >u139C Save ptr + puls b Restore count + tst <u0071 + bne L2582 + inc <u0071 + bra L255D + +L2582 clr <u0071 + tstb + bne L2555 + puls pc,y,x,d + +L258A leay 1,y + sty >u139C + tst ,y + bne L2582 + lda <u0C82 Get SSn # (0-3) + inc <u0C82 Inc copy of it + inc >u0C83 + ldb #$40 + mul + ldy #u111C Point to search strings buffer + leay d,y Point to entry within buffer + sty >u139C Save new SSn string ptr to check + puls pc,y,x,d + +* Deal with RSn buffer strings +L25B1 pshs y,x,d + clr >u0C83 + lda <u0C82 + suba #$02 + ldb #$40 + mul + ldx #u121C Point to RSn reply string buffer + leax d,x Point to entry within buffer + pshs x Preserve ptr + clrb +* Calc size of reply string +L25C9 lda ,x+ Get char from buffer + incb + cmpb #$40 Done whole buffer? + bhi L25D4 Yes, skip ahead + cmpa #C$CR Done to end of string? + bne L25C9 No, keep looking +L25D4 decb Adjust size back down + puls x Get ptr to beginning of string again + tstb Was there anything in the string? + beq L25E8 No, exit +* This write/convert loop could be optomized +L25DB lda ,x+ Yes, get char + decb Dec counter + cmpa #'\ Special char? + beq L25F6 Yes, go process + lbsr L1A76 No, write char to modem +L25E5 tstb Done whole string? + bne L25DB No, continue until done +L25E8 puls pc,y,x,d + +L25EA pshs x Preserve X + ldx #30 Sleep for 30 ticks (1/2 sec) + lbsr L0F56 Go sleep (and update timer if needed) + puls x Restore X + bra L25E5 + +* \ (control letter) processor for RSn strings? +L25F6 lda ,x+ Get byte from reply string + decb Drop count + cmpa #'^ Caret (ESC)? + beq L260C Yes, send <ESC> + cmpa #'* 1/2 second pause? + beq L25EA Yes, go do + cmpa #'\ Double '\\'? + beq L2607 Yes, go send '\' + suba #$40 Any others drop by $40 (ctrl chars) +L2607 lbsr L1A76 Send to modem + bra L25E5 Continue until RSn string is done + +L260C lda #C$EOF Send escape code + bra L2607 + +* Copy main DWSet sequence into buffer +L2620 leax >L0469,pc Point to main DWSet + ldy #u13A9 Point to buffer + ldb #$0C 12 bytes to copy + lbra L2D1E Go copy them & return from there + +* <ALT>-<Z> conference mode toggle +L2610 pshs y,x,d Preserve regs +L2612 tst <u0040 Conference mode on? + lbne L26EE Yes, go shut it off + inc <u0040 Set it to on + bsr L2620 Go set up buffer for DWSet +* First, redo main window to leave 3 lines at bottom +L262E ldx #u13A9 Point X to DWSet buffer + ldd <u0090 Get X&Y sizes of main window + subb #$03 Bump Y down by 3 (allow room for conference) + std 7,x Save as new sizes in DWSet string + lda #$FF Set to current displayed screen + sta 4,x + ldd <u0087 Get fore/background colors of window + std 9,x Save them + lda #$01 Redo main window to smaller size + ldy #$000B + os9 I$Write + lda #WRITE. Now, open path to /W (next avail. window) + leax >L0467,pc + os9 I$Open + bcs L2612 Error, shut conference mode off & exit + sta <u003F Save path to conference mode window + ldx #u13A9+2 Point to buffer+2 (past DWEnd) + clr 2,x Set to process' current screen + lda <u0091 Get Y size of main window + suba #2 Bump down by 2 (3 since base 0) + sta 4,x Start Y coord @ end of screen -2 + lda #3 Y size=3 + sta 6,x + lda <u0089 Get ??? color + sta 7,x Save as foreground color for conference mode + lda <u0088 Get main window background color + sta 8,x Save as background color for confence window + lda <u003F Get path to conference window + ldy #$0009 Create the conference mode window + os9 I$Write +L268D lda <u0087 Get FColor of main window + ldx #u009C Point to Fcolor string + sta 2,x Save color + ldy #$0003 Set foreground color for conference window + lda <u003F + os9 I$Write + ldx #u13A9 + ldd #'-*256+80 Put 80 '-' in buffer +L26A9 sta ,x+ + decb + bne L26A9 + ldx #u13A9 + lda <u003F + ldy #80 + os9 I$Write Write out conference mode line + ldx #u009C Point to FColor string + lda <u0089 Get ?? color + sta 2,x Set Fcolor of conference window + ldy #$0003 + lda <u003F + os9 I$Write + leax >L09EF,pc Change working area to use only 2 lines + ldy #$0006 (to keep '---'... line on screen) + os9 I$Write + lbsr L284E Do Inv On/Space/Inv Off/Bsp (WHY???) + leax >L09E8,pc Point to 'Conf' + lda <u003E Send to Status window + ldy #$0007 + os9 I$Write +L26EC puls pc,y,x,d Restore & return + +* Shut Conference mode off +L26EE clr <u0040 Flag conference mode off + leax >L0475,pc DWEnd the conference window + lda <u003F + ldy #$0002 + os9 I$Write + lda <u003F Close path to conference window + os9 I$Close + lbsr L2620 Copy DWEnd/DWSet for main window string + ldx #u13A9 Point to it + ldd <u0090 Get X/Y size of main window + std 7,x Save in string + lda #$FF Current displayed screen + sta 4,x + ldd <u0087 Fore/Background colors of main window + std 9,x + lda #$01 Std Out + ldy #$000B + os9 I$Write Change main window back to it's normal size + leax >L09E1,pc CurXY @ 0,0 & print 4 spaces + lda <u003E Send that to the Status window (erase 'Conf') + ldy #$0007 + os9 I$Write + puls pc,y,x,d Restore & return + +* Keyboard read called from conference mode +L273D clra Std In + ldy #$0001 + ldx #u060E + os9 I$Read Read 1 byte + ldx <u0066 Get ptr to current char in Conf. kybrd buffer + lda >u060E Get key read + cmpa #$8C Higher than <ALT>-<Up Arrow> ? + lbhi L157B Yes, go check for special (keysense) keys + cmpa #$7F Alt Arrows, etc. ($80-$8c)? + lbhi L0C5E Yes, return to main loop + cmpa #$18 <CTRL>-<X> (SHIFT-BSP)? + bne L2765 No, check next + lda #$7F Yes, replace with real DEL/RUBOUT key + bra L27A1 Go save in buffer @ X + +L2765 cmpa #$1A <CTRL>-<Z>/<SHIFT>-<DOWN>? + lbeq L157B Yes, go check key-sense bytes + cmpa #$1C <SHIFT>-<UP>? + lbeq L157B Yes, go check keysense bytes + cmpa #$0A <DOWN> / LF? + lbeq L0C5E Yes, return to main loop + cmpa #$0C <UP> / Clear screen? + lbeq L0C5E Yes, return to main loop + cmpa #$09 <RIGHT> / Up 1 line? + lbeq L0C5E Yes, return to main loop + cmpa #$08 <LEFT> / BSP? + bne L2796 No, skip ahead +* Backspace + ldb <u0068 Get # keys in Conf. keyboard buffer + beq L27B2 If none, skip ahead + leax -1,x Bump ptr to current char in kybrd buffer back + stx <u0066 Save new ptr + dec <u0068 Dec # keys in Conf. keyboard buffer + bra L27AD CHECK:REDUNDANT TO CHECK FOR CR THEN BSP AGAIN + +L2796 ldb <u0068 Get # keys in conference buffer + cmpb #253 Within max. range? + blo L27A1 Yes, go save it in buffer + cmpa #C$CR About to overflow, was key CR? + bne L27B2 No, beep so user knows we're full +L27A1 sta ,x+ Save keypress in conference mode kybrd buffer + stx <u0066 Save new current char ptr for buffer + inc <u0068 Bump up count of # keys in conf. mode kybrd buff. + cmpa #C$CR Was char a CR? + beq L27C6 Yes, skip ahead +L27AD bsr L27FD NO, CHECK FOR CR & BSP AGAIN ?!? + lbra L0C5E Go back to main loop + +* Conference mode keyboard buffer overflow +L27B2 lda #$07 <CTRL>-<G> beep + ldx #u13A9 Write it out + sta ,x + lda #$01 + ldy #$0001 + os9 I$Write + lbra L0C5E Go back to main loop + +L27C6 lda #C$LF Append LF + sta ,x+ + ldb <u0068 Get # keys in buffer + tst >u0CA9 + beq L27D4 + incb Bump up count by 1 +L27D4 clra + tfr d,y Move count to Y + lda <u002B Get path to modem + ldx #u050F Point to buffer + os9 I$Write Send to modem + clr <u0068 Set # keys in conf. kybrd buffer to 0 + ldx #u050F Point to conf buffer again + stx <u0066 Save as current char ptr for conf buffer + lda #C$CR Stick CR in start of normal keyboard buffer + sta >u060E + bsr L27FD Process CR + lda #C$LF Stick LF in start of normal keyboard buffer + sta >u060E + bsr L27FD Process LF + lbra L0C5E Return to main loop + +L27FD lda >u060E Get last key read + cmpa #C$CR CR (send line)? + bne L281C No, skip ahead + ldd #$200D Space & CR + ldx #u13A9 Save in temp buffer + std ,x + lda <u003F Get path to conference window + ldy #$0002 Write out space & CR + os9 I$Write + rts return + +L281C cmpa #C$BSP Was key backspace? + bne L2835 No, go print key to conf. window + ldd #$2008 Space & Backspace + ldx #u13A9 + std ,x + lda <u003F Send to conf. window + ldy #$0002 + os9 I$Write +L2835 ldx #u060E Send key pressed to conf. window + ldy #$0001 + lda <u003F + os9 I$Write + lda >u060E Get key pressed + cmpa #C$CR Is it CR? + bne L284E Yes, skip ahead + rts Otherwise return + +L284E lda <u003F Send Inv On/Space/Inv Off/Bsp to conf. window + leax >L0493,pc + ldy #$0006 + os9 I$Write + rts + +* Filename parse for Batch Receive??? +* YModem Batch (WXModem) header as follows: +* Block # (1 byte) +* Compliment of block # (1 byte) +* Some sort of filename parse: allows upper/lower case, numbers +* Unknown chars are forced to be Underscores (_) +L2860 pshs y,x,d Preserve regs + ldx #u00DF+3 Point 3 bytes into input buffer from modem + pshs x Save ptr to start of list +L2868 lda ,x+ Hunt for 1st 0 byte @ u00E2 + bne L2868 + leax -1,x + pshs x Save ptr to 1st 0 byte + clr <u009A Clear flag? +* Found 1st NUL in modem buffer past u00DF+3, now parse it +L2874 lda ,-x Now, go backwards getting chars as we go + cmpx 2,s At beginning again? + blo L28AA Yes, skip ahead + cmpa #'A Check if alphabetic char (case ignored) + blo L2890 Below alphabetic, go try #'s, etc. + cmpa #'Z + bls L2874 If A-Z, its fine + cmpa #'a If [\]^_' then check if \ to /, else _ + blo L28A6 S/B L28A6 & BELOW SHOULD BE L28A0 + cmpa #'z + bhi L28A0 If {|}~ or $7F, force to underscore + sta <u009A Save char if lowercase + bra L2874 Keep going + +* Char below 'A' +L2890 cmpa #'9 + bhi L28A0 If :;<=>?@ then change to underscore _ + cmpa #'0 + bhs L2874 If 0-9, its fine + cmpa #'. If period, it's fine + beq L2874 + cmpa #'/ Path separator? + beq L28AA Special check +L28A0 lda #'_ Force to be underscore + sta ,x Replace original char in buffer + bra L2874 Continue checking + +* USELESS, CAN ONLY GET CALLED IF CHAR IS CHR$($7B-$7F), AND BACKSLASH IS $5C +* COULD BE USED TO CHANGE PATH SEPARATORS (EX. MS-DOS) TO NORMAL ONES +L28A6 cmpa #'\ Backslash? + bne L28A0 No, force to underscore +* Backslash handler +L28AA leax 1,x Point to char again + lda ,x Get it + beq L28C2 If NUL skip ahead + cmpa #C$CR End of line? + beq L28C2 Yes skip ahead + cmpa #'A Char below alpha? + blo L28BC Yes, skip ahead + cmpa #'_ Underscore? + bne L28C2 No, skip ahead +* Underscore or below A go here - these get replace by 'x' +L28BC leax -1,x Bump ptr back + lda #'x Force char to be 'x' + sta ,x +L28C2 stx 2,s Save ptr as beginning ptr + tst <u009A Did we have lowercase char? + bne L28DE Yes, skip ahead +L28CA lda ,x+ No, get char + cmpx ,s Are we within buffer @ u00E1? + bhi L28DE Yes, skip ahead + cmpa #'A Uppercase char? + blo L28CA No, keep going forward + cmpa #'Z + bhi L28CA + ora #$20 Uppercase, force to lowercase + sta -1,x + bra L28CA + +L28DE ldy #u009F + ldx 2,s + ldd ,s++ + subd ,s++ + cmpb #29 Small enough to be filename? + bls L28EE + ldb #29 +L28EE lbsr L2D1E + lda #C$CR + sta ,y + leax 1,x + bsr L2968 + leax >L056B,pc Print 'Recv:' + lbsr L1B03 + ldx #u009F + lda ,x + beq L2938 + cmpa #C$CR + beq L2938 + lda #$01 Std Out + ldy #$0020 + os9 I$WritLn + leax >L048F,pc Cursor OFF + lbsr L1B03 + ldd <u005B+2 Get LSW of file size + bne L2944 There is one, skip ahead + ldd <u005B Get MSW of file size + bne L2944 +L2926 ldx #u009F + ldd #$WRITE.*256+UPDAT. Write mode, Read & Write attributes + os9 I$Create + bcs L2938 + sta <u0042 Save path # to download file + puls pc,y,x,d Restore & return + +L2938 lda #$FF + sta <u0042 Set download path # to invalid + lda #$0A + sta <u0052 + puls pc,y,x,d Restore & return + +* Have file size, print it +L2944 leax >L0577,pc Print 'Size:' + lbsr L1B03 + ldx #u13AA + ldy #$0007 +L2953 lda ,x + cmpa #'0 + bne L2961 + leax 1,x + leay -1,y + beq L2926 Go create the download file + bra L2953 + +L2961 lda #$01 Write to Std Out + os9 I$Write + bra L2926 + +L2968 pshs y,x,d + ldd #$0000 Init file size to 0 bytes + std <u005B + std <u005B+2 + ldb #$08 Max count=8 chars +L2975 lda ,x+ Get char + beq L2983 If NUL, skip ahead + cmpa #C$SPAC Space? + beq L2983 Yes, skip ahead + decb Dec count + bne L2975 Keep going until all 8 done + puls pc,y,x,d Restore & return + +L2983 ldy #u13B0 + leax -1,x Point back to space or NUL + ldb #$08 Max distance backwards +L298B lda ,-x + beq L2996 + sta ,-y + decb + cmpb #1 + bne L298B +L2996 lda #'0 +L2998 sta ,-y + decb + cmpb #1 + bne L2998 + ldy #u13A9 + leax >L09F5,pc Point to table for decimal conversion + clrb Start at highest level (1,000,000) +* B=Current position to convert (0=1,000,000 1=100,000 etc.) +* X=Ptr to 4 byte integer conversion table +* Y= +L29A8 pshs b,x Preserve digit field # & table ptr + lda #$04 4 bytes / entry (for Long Ints) + mul + leax d,x Point to proper entry + ldb ,s Get which digit we are on + lda b,y + suba #'0 + tfr a,b + beq L29E9 +L29C2 lda 3,x Add 4 byte table to 4 byte longint variable + adda <u005B+3 + sta <u005B+3 + lda 2,x + adca <u005B+2 + sta <u005B+2 + lda 1,x + adca <u005B+1 + sta <u005B+1 + lda ,x + adca <u005B + sta <u005B + decb + bne L29C2 +L29E9 puls b,x + incb Next level lower + cmpb #8 Done all of them? + bne L29A8 No, keep converting + puls pc,y,x,d + +* Check if <CTRL>-<E> / <BREAK> was pressed by user +* Entry: None +* Exit: Carry clear if no <BREAK> in keyboard buffer +* Carry set if one was pressed +* All regs preserved +L29EB pshs y,x,d Preserve regs + lbsr L13C2 Go check if any data waiting in keyboard buffer + bcs L2A0F No, skip ahead + clra Yes, put # bytes waiting into Y + tfr d,y + ldx #u060E Point to keyboard buffer + clra Std In + os9 I$Read Go read it in + bcs L2A0F Error, skip ahead + tfr y,d + ldx #u060E Point to beginning of buffer again +L2A06 lda ,x+ Get keypress + cmpa #$05 <CTRL>-<E> / <BREAK>? + beq L2A12 Yes, exit with carry set + decb Check whole keyboard buffer for it + bne L2A06 +L2A0F clrb No break key, exit with carry clear + puls pc,y,x,d + +L2A12 comb <BREAK> key found, exit with carry set + puls pc,y,x,d + +L2A15 pshs y,x,b Preserve regs + lbsr L3BBC Go update seconds (via VRN if present else CLOCK) +L2A1A bsr L29EB Check if <BREAK> was pressed by user + bcs L2A4C Yes, restore regs & return + lda <u002B Get path to modem + ldb #SS.Ready Check if any data ready + os9 I$GetStt +* NOTE: MAY WANT TO CHANGE L2A31 BELOW TO DO LDA <u002B,u FIRST SO BCC HERE +* CAN SKIP IT & GO STRAIGHT TO LDY + bcc L2A31 Maybe, go check it out + lbsr L3BDA No data on modem, go update on-screen timer + cmpa #'; Key pressed a Semi-colon or lower? + blo L2A1A Yes, eat it & try again + comb Set carry to indicate key-press? +L2A4C puls pc,y,x,b Restore & return + +L2A31 ldy #$0001 Get 1 byte from modem + lda <u002B Go get path to modem + ldx #u04EF + os9 I$Read Read 1 byte from modem + bcs L2A4F If error, make char=NUL + lda >u04EF Get key pressed + clr >u04EF Clear out the buffer +L2A49 clrb No error & return with char in A + puls pc,y,x,b Restore & return + +L2A4F clra Clear char to NUL? + bra L2A49 Exit with carry clear? + +L2A52 pshs y,x,d Preserve regs + leax >L048B,pc Turn cursor ON + lbsr L1B03 + clrb 1st 32 bytes of screen + ldx #u070D Point to screen output buffer +L2A60 pshs x,b Preserve + bsr L2A81 Print 'File:' & filename + puls x,b Restore ptrs + lda >u060E Get 1st char of filename + cmpa #C$CR Was it CR? + beq L2A78 Yes, go turn cursor back on + tst <u0021 + bne L2A78 + incb Inc which filename counter??? + cmpb #$20 32 allowed??? + bne L2A60 +L2A78 leax >L048F,pc Turn cursor ON & return + lbsr L1B03 + puls pc,y,x,d + +* Entry: X=Ptr to screen output buffer +* B=??? +L2A81 lda #$20 Each B represents 32 bytes + mul + leax d,x Point that far into screen buffer + pshs x Preserve it + leax L055F,pc point to 'File:' + lbsr L1B03 print it + ldb #30 + lbsr L1B61 Get input string locally (?) + puls x Restore pointer + ldy #u060E Point to where filename is + ldb #32 get length + lbra L2D26 Copy 32 bytes from Y to X (filename into scrn bffr) + +L2AA0 pshs y,x,d + ldb <u006A + lda #$20 + mul + ldx #u070D Point to output screen buffer + leax d,x + ldy #u009F Point to old filename for downloads + ldb #$20 + lbsr L2D1E + inc <u006A + puls pc,y,x,d + +L2ABC pshs y,x,b + lda #$01 + sta <u0029 + bra L2ACA + +* Check if key waiting +L2AC5 pshs y,x,b + clr <u0029 +L2ACA lbsr L13C2 Any data ready in keyboard buffer? + bcc L2AD7 Yes, skip ahead + ldx #$0003 + lbsr L0F56 Check for timer update + bra L2ACA Loop + +* If key waiting, get & convert to uppercase +L2AD7 tstb Any chars waiting in keyboard buffer? + beq L2ACA No, go back to loop + ldx #u001B Point to buffer to hold keypress + ldy #$0001 + clra Std In + os9 I$Read Read the key + lda ,x + tst <u0029 + bne L2AF3 + cmpa #$60 Under apostrophe? + blo L2AF3 Yes, leave alone (upper case) + suba #$20 Convert lower to upper case +L2AF3 puls pc,y,x,b Restore & return + +* Hangup the modem from Driver call +L2AF5 clr <u001A Clear 1 byte buffer + lda <u002B Get path to modem + ldb #SS.HngUp Hangup the modem + os9 I$SetStt + bcs L2B07 If error, skip ahead + inc <u001A ??? Set flag + rts +* No SS.HngUp call (probably ACIAPAK) - manually diddle with 6551 hardware +L2B07 ldx #u0C2E point to path option packet from modem + ldd $1B,x get device table address + addd #V$DESC point to descriptor address + std <u0013 save pointer + lda #$01 get system process descriptor + ldx #u070D Point to buffer to hold process dsc. + os9 F$GPrDsc + leax P$DATImg,x point to DAT image + stx >u0C84 Save ptr + tfr x,d Move to D + ldx <u0013 get descriptor address + ldy #$0002 get # bytes needed + ldu #u13A9 Point to buffer + os9 F$CpyMem get actual address of descriptor + ldx >u13A9 get the descriptor address + leax IT.DLO,x Point to Delete line offset + ldd >u0C84 Get ptr to DAT image + ldy #$0002 Get DELETE line & echo settings + ldu #u0011 Where to put copies of them + os9 F$CpyMem +* NOTE: Should be able to remove this LDU entirely + ldu #$0000 Reset U to normal + rts + +L2B50 pshs y,x,d Preserve regs + ldx #u13A9 Point to temp buffer + ldd #$0253 CurXY to 51,1 + std ,x + lda #$20 + sta $02,x + ldy #$0003 + lda <u003E Position cursor in status window + os9 I$Write + ldx #u002D Point to name of terminal port + clrb +L2B6D lda ,x+ Print name (up to 1st 5 chars) of port in status + incb window + cmpa #$21 + blo L2B78 + cmpb #$05 + blo L2B6D +L2B78 ldx #u002D + clra + tfr d,y + lda <u003E + os9 I$Write + puls pc,y,x,d + +L2B86 leay >L0481,pc Foreground/background color sets & clear scrn + ldx #u13A9 Buffer to hold + pshs x + ldb #$07 Copy all 3 commands into buffer + lbsr L2D26 + puls x + lda <u0086 Get ??? color + sta $05,x Save as background color + lda <u0087 Get Fcolor of main window + sta $02,x Save as foreground color + lda <u003E Clear out status window with these colors + ldy #$0007 + os9 I$Write + tst <u0040 Is conference mode on? + beq L2BC0 No, skip ahead + lda <u003E Print 'Conf' in status window + leax >L09E8,pc + ldy #$0007 + os9 I$Write +L2BC0 leay >L00EB,pc Copy 'Supercomm' header into buffer + ldx #u13A9 + ldb #$1E + lbsr L2D26 + ldx #u13A9 Modify colors + lda <u008C + sta $07,x + lda <u0087 Get Fcolor + sta <$19,x + tst <u0019 Special version flag set? + beq L2BE8 No, skip ahead + lda #$61 Yes, add 'a' to name + sta <$16,x +L2BE8 lda <u003E Print status window so far + lbsr L1B05 + lbsr L2B50 Print port name in status window + lbsr L237E Set/Print Capture buffer open status to OFF + tst <u002B Do we have path to serial port? + beq L2BFC No, skip ahead + lbsr L118F Yes, update baud rate/word len, parity, stp bits +L2BFC lda <u0072 VRN on? + beq L2C13 No, skip exit + tst <u0075 Timer on? + lbeq L0F20 No, send out black timer string + ldx #u0077 Point to timer string buffer + ldy #$000B Send to status window with active colors + lda <u003E + os9 I$Write +L2C13 rts + +L2C18 tst <u0040 Conference mode on? + beq L2C71 No, exit + leax >L09EF,pc Point to CWArea 0,1 to 80,3 string + ldy #u13A9 Point to buffer + ldb #$06 + lbsr L2D1E Copy it + ldx #u13A9 Point to buffer again + clra + sta 3,x Change so CWArea 0,0 to 80,2 + lda #3 + sta 5,x + ldy #$0006 + lda <u003F Send to conference window + os9 I$Write + leay >L0481,pc Clear out the conference window + ldx #u13A9 + pshs x + ldb #$07 + lbsr L2D26 + puls x + ldd <u0088 Get Bcolor of main window/Fcolor of conf. window + sta $05,x Save them + stb $02,x + lda <u003F Send to conference window + ldy #$0007 + os9 I$Write + leax >L09EF,pc Point to CWArea again (from 0,1 to 80,3) + ldy #$0006 Change to new working area + os9 I$Write +L2C71 rts + +* Error with size of file, so set internal vars to indicate size=0 bytes +L2C8D ldd #$0000 Save size as 0 bytes + std <u005B + std <u005B+2 + puls pc,y,x,d Restore regs & return + +* NOTE: WHEN ALL U REFERENCES GONE, CAN ELIMINATE PSHS/PULS U +L2C72 pshs y,x,d Preserve regs + lda <u0042 Get path to download file + ldb #SS.Size Get size of file + os9 I$GetStt + tfr u,y Move LSW of size to Y + bcs L2C8D Error getting size, set to 0 + stx <u005B Save 4 byte size + sty <u005B+2 +L2C98 ldx 2,s Get original X back + leay >L09F5,pc Point to decimal conversion table + pshs x Preserve ptr to buffer for ASCII # + ldd #$3007 Fill buffer with 7 '0's +L2CA4 sta ,x+ + decb + bne L2CA4 + puls x Point to beginnning again + clrb Digit 0 (1,000,000) is where we start +L2CAC pshs y,x,d Preserve regs again + bsr L2CDB Convert the digit + puls y,x,d Restore regs + incb Point to next ASCII converted digit + cmpb #8 Done all of them? + bne L2CAC No, continue + pshs x Save ptr to ASCII string + leax >L0577,pc Print 'Size:' + lbsr L1B03 + puls x Get ptr to ASCII string + ldy #$0007 Size of # +L2CC6 lda ,x Get char + cmpa #'0 Is it a 0? + bne L2CD4 No, can print rest of string + leax 1,x Point to next char in ASCII string + leay -1,y Bump # bytes to print down + bne L2CC6 Still some left, see if they are 0's + puls pc,y,x,d If 0, just exit + +L2CD4 lda #$01 Write the size to Std Out + os9 I$Write + puls pc,y,x,d + +* Entry: Y=Ptr to decimal conversion table +* X=Ptr to 7 byte buffer for ASCII # (up to 9,999,999) +* B=which ASCII # (0-6) (from million to 1) we are currently doing +* Does one digit, adjusting file size in mem down with repeated subtracts +L2CDB leax b,x Point to appropriate table entry in ASC # bffr + clra Calculate which 4 byte longint to try in table + lslb + rola + lslb + rola + leay d,y Point to it +L2CE2 ldd ,y Get MSW of table entry + cmpd <u005B Is it higher than MSW of file size? + bhi L2D1D Yes, skip ahead + blo L2CF4 If lower, skip ahead + ldd 2,y Get LSW of table entry + cmpd <u005B+2 Is it higher than LSW of file size? + bhi L2D1D No, skip ahead +L2CF4 ldd <u005B Get MSW of file size + bne L2CFE If file >64K, skip ahead + ldd <u005B+2 <64K, get size + beq L2D1D If 0, return +L2CFE inc ,x Inc. ASCII # + ldd <u005B+2 Get LSW of file size + subd 2,y Subtract LSW of table entry + std <u005B+2 Save result + bhs L2D13 Didn't wrap, continue + ldd <u005B Get MSW of file size + subd #$0001 Bump down by 1 + std <u005B Save result +L2D13 ldd <u005B Get MSW of file size + subd ,y Subtract MSW of table entry + std <u005B Save it + bra L2CE2 Continue through until this digit is done + + +* Move data from X to Y +* Entry: B=Count +* X=Pointer to source +* Y=Pointer to destination +L2D1E lda ,x+ + sta ,y+ + decb + bne L2D1E +L2D1D rts + +* Move data from Y to X +* Entry: B=Count +* X=Pointer to destination +* Y=Pointer to source +L2D26 lda ,y+ + sta ,x+ + decb + bne L2D26 + rts + +L2D2E pshs x,a + tst <u001A + beq L2D41 + lda <u002B Get path to modem + ldb #SS.ComSt Get current parity & baud rate + os9 I$GetStt + tfr b,a Move possible error code to A + bra L2D46 + +L2D41 ldx <u0011 Get ??? + lda 1,x +L2D46 anda #$20 + beq L2D4D + clrb +L2D4B puls pc,x,a + +L2D4D comb + puls pc,x,a + +L2D50 pshs x,d Preserve regs + ldx #$0003 Sleep 3 ticks (or until signal) + os9 F$Sleep + ldb #SS.Ready Any data ready on modem? + lda <u002B Get path # to modem + os9 I$GetStt + bcs L2D7E No, exit + ldx #$0015 Go sleep for up to 21 ticks + lbsr L0F56 +* NOTE: IT DOESN'T CHECK IF THERE ACTUALLY IS DATA THERE THIS TIME + lda <u002B Any data ready on modem this time? + ldb #SS.Ready + os9 I$GetStt + clra + tfr d,y # bytes ready into Y + ldx #u13A9 Buffer to put modem data in +* NOTE: SHOULD BE ABLE TO REMOVE MOST OF THESE DOUBLE LDA'S OF PATH # + lda <u002B Get path # to modem again + os9 I$Read Read from modem + clrb +L2D7E puls pc,x,d Restore & return + +* Entry: B=Count +* X=Ptr +L2D82 lda ,x+ Get byte + decb Done all bytes? + bne L2D8B No, skip ahead + ldb #$01 + bra L2DC7 + +L2D8B cmpa #'0 If not a number, eat char & try next + blo L2D82 + cmpa #'9 + bhi L2D82 + tfr x,y Found numeric digit, move ptr to it to Y + leay -1,y Bump back by 1 +L2D97 lda ,x+ Now, search for next non-digit from here + cmpa #'0 + blo L2DA3 + cmpa #'9 + bls L2D97 + +L2DA3 leax -1,x Bump ptr back to 1st non-digit past digit + ldd #$2020 Store 2 spaces here + std ,x + lda #$A0 ??? + sta 4,y + leax >L0652,pc Point to baud rate table + clrb +* NOTE: ELIMINATE F$CMPNAM WITH LOCAL VERSION!!! +L2DB3 pshs y,x,b Preserve regs + ldb #$05 Size to compare + os9 F$CmpNam Check if they match + puls y,x,b Restore regs + bcc L2DC7 They match, skip ahead + leax 5,x Point to next baud rate to check + incb Inc baud rate counter + cmpb #8 Done all 8 possible baud rates + bne L2DB3 No, try next + rts Yes, return + +* Found baud rate match +L2DC7 lda >u0CA5 Get baud/stop bits/word len + anda #%11111000 Keep all but baud + sta >u0CA5 Save result + orb >u0CA5 Merge in baud rate + stb >u0CA5 Save with new baud rate + lbra L118F Go update the status line & return + +* NOTE FIX CMPNAM BELOW TO NOT USE SYSTEM CALL!!! +L2DDD pshs y,x,d Preserve regs + lbsr L2D50 Check for data ready on modem + bcs L2E1B Nope, Exit with carry set + sty <u0C88 Save # bytes waiting (into size of conv. txt bfr) + ldx #u13A9 Point to temp buffer + ldb <u0C89 Get LSB of modem buffer size + subb #7 Bump down by 7 (to fit word 'CONNECT') +L2DF3 pshs x,b Preserve regs + leay <L02D1,pc Point to 'CONNECT' + ldb #$07 Check if connect string found + os9 F$CmpNam + puls x,b Restore regs + bcc L2E09 Found, skip ahead + leax 1,x Bump source ptr up by 1 + decb Dec # bytes left in read buffer to check + bne L2DF3 Keep checking whole buffer +L2E1B comb Not found, exit with carry set + puls pc,y,x,d + +L2E09 ldb <u0C89 Get LSB of buffer size + ldx #u13A9 Point to temp buffer + ldy #u00DF Point to modem buffer + lbsr L2D1E Copy temp buffer to modem buffer + clrb No error & exit +L2E19 puls pc,y,x,d + +L02D1 fcs 'CONNECT' + +L02D8 fcs 'BUSY' + +* NOTE FIX CMPNAM BELOW TO NOT USE SYSTEM CALL!!! +L2E1E pshs y,x,d Preserve regs + ldx #u13A9 Point to temp buffer + ldb #$0E (Only checks 1st 14 bytes) +L2E26 pshs x,b + leay <L02D8,pc Point to 'BUSY' + ldb #$04 + os9 F$CmpNam See if we found it + puls x,b + bcc L2E3C Yes, skip ahead + leax 1,x Go forward through buffer looking for 'BUSY' + decb Keep checking until done + bne L2E26 +L2E3C puls pc,y,x,d Restore & return + +* Re-Calculate module CRC and re-save module +L2E3E pshs d,x,y,u preserve regs + leax name-$d,pc point to start of module + ldy M$Size,x get module size + stx <u0015 save pointer to start of module + leay -3,y take off size of CRC + sty <u0017 save module size + tfr x,u calculate CRC + tfr y,d + leau d,u + ldd #$FFFF + std ,u + sta 2,u + os9 F$CRC + com ,u + com 1,u + com 2,u + puls d,x,y,u restore regs + lda #EXEC.+UPDAT. open supercomm in current execution DIR + leax name,pc point to module name + os9 I$Open open it + bcs L2E82 error, return + ldx <u0015 get pointer to module header + ldy <u0017 get module size + leay 3,y add CRC + os9 I$Write write it + os9 I$Close close file +L2E82 rts return + +L2E83 pshs y,x,d Preserve regs + leax >L0A24,pc Point to default option settings + ldy #u0CA5 Point to current option settings + ldb #$4D Copy current options, dial directory & + lbsr L2D26 Default dir into code (for init) + ldd #$1603 Set overlay window size to 22x3 + std >u0C91 Save + ldd #$1D04 Start coords @ 29,4 + std >u0C8F + lbsr L1C81 Pop up the overlay window + leax >L048F,pc Cursor OFF + lbsr L1B03 + leax >L08B6,pc Print 'Saving SuperComm' + lbsr L1B03 + bsr L2E3E Re-Calc CRC for supercomm & save it + leax >L048B,pc Turn Cursor ON + lbsr L1B03 + lbsr L1CDE Remove overlay windows + puls pc,y,x,d Restore regs & return + +L2EBF pshs y,x,d + tst <u0072 Is there a path to VRN? + beq L2ED8 No, skip ahead + clr <u0075 Force timer to OFF + leax >L0366,pc Point to default timer string + ldy #u0077 Point to buffer for ASCII timer string + ldb #$0B Copy default into current + lbsr L2D1E + lbsr L0F20 Update the timer on-screen +L2ED8 lbsr L43CA ??? Do something with receive buffer? + tst <u0040 Conference mode on? + beq L2EE3 No, skip ahead + lbsr L2610 Yes, draw it on screen +L2EE3 ldd #$0000 + std <u0009 + ldx #u16B9 Point to start of ASCII receive buffer + stx <u0093 Save ptr + clr <u0064 ??? + lbsr L1EDC Clear the screen + ldd #$0503 Overlay window from 5,3 to 73,19 + std >u0C8F + ldd #$4411 + std >u0C91 + lbsr L1C81 Go put it on screen + lda #$81 + leax >L0A31,pc point to path to dial directory + os9 I$Open + bcs L2F9A + sta <u003D Save path # to dialing directory name +* NOTE: CAN REMOVE PSHS/PULS U LATER + pshs u + ldx #$0000 skip past '.' & '..' + ldu #$0040 + os9 I$Seek + puls u + bcs L2F9A +L2F26 lda <u003D Get path # to directory + ldy #$0020 Size of 1 dir entry + ldx #u13A9 Point to temp buffer + os9 I$Read Read filename + bcc L2F3C Got filename, skip ahead + cmpb #E$EOF End of directory? + bne L2F9A No, exit with error + bra L2F4C Skip ahead + +L2F3C lbsr L3118 Go check filename + bcs L2F43 + bsr L2FA5 +L2F43 lda <u0064 + cmpa #$1D + bls L2F26 +L2F4C lda <u0064 + sta >u0C98 + lda <u003D Close path to dir + os9 I$Close + lbsr L3038 + tst <u0092 + beq L2F79 + lbsr L1BC7 + ldd #$0000 + std >u131C + lbsr L1EDC + leax >L048F,pc + lbsr L1B03 + lbsr L314B +L2F79 lbsr L1CDE + lbsr L1BDF + lbsr L1C57 + lbsr L1EDC + leax >L048B,pc + lbsr L1B03 + puls y,x,d Restore regs + ldx #u00DF Get ptr to modem buffer + ldy <u0C88 Get # bytes read on modem + lbra L0FD2 Go process + +L2F9A os9 F$PErr Print error + ldx #$0078 Sleep for up to $78 ticks??? + lbsr L0F56 + bra L2F79 + +L2FA5 pshs y,x,d Preserve regs + ldx #u13A9 Point to filename buffer + ldy <u0093 + ldb #$1E +L2FB2 lda ,x+ Get char from filename buffer + decb Dec count + tsta Hi bit set (end of filename)? + bpl L2FC3 No, copy char & keep going + suba #$80 Bump down to normal char + sta ,y+ Save normal version + ldd #$0A0D Add LF & CR + std ,y + bra L2FC8 + +L2FC3 sta ,y+ Save char + tstb Done maximum chars yet? + bne L2FB2 No, continue copying/checking + +L2FC8 inc <u0064 + bsr L300E + bsr L2FDE + ldy <u0093 + leay <$20,y + sty <u0093 + puls pc,y,x,d Restore & return + +L2FDE pshs y,x,d Preserve regs + ldx <u0093 ??? + ldy #u13A9 Point to temp buffer + ldb #$1E +L2FEA lda ,x+ + decb + cmpa #'_ + bne L2FF3 + lda #C$SPAC +L2FF3 cmpa #'. + bne L2FFA + lda #C$CR + clrb +L2FFA sta ,y+ + tstb + bne L2FEA + lda #$01 + ldy #$001E + ldx #u13A9 + os9 I$WritLn + puls pc,y,x,d + +L300E pshs y,x,d + ldx #u13A9 + ldb <u0064 + cmpb #$0F + bhi L301F + lda #$24 + bra L3023 +L301F lda #$45 + subb #$0F +L3023 sta $01,x + lda #$02 + sta ,x + addb #$20 + stb $02,x + ldy #$0003 + lda #$01 + os9 I$Write + puls pc,y,x,d + +L3038 pshs y,x,d Preserve regs + leax >L048F,pc Cursor OFF + lbsr L1B03 + lda #$01 + sta <u0092 +L3047 ldx #u13A9 + cmpa >u0C98 + bls L3059 + lda >u0C98 + sta <u0092 +L3059 cmpa #$0F + bhi L3061 + adda #$20 + bra L3063 + +L3061 adda #$11 +L3063 sta $02,x + lda <u0092 + cmpa #$0F + bhi L3071 + lda #$21 + bra L3073 + +L3071 lda #$42 +L3073 sta 1,x + lda #$02 + sta ,x + bsr L3107 Go blank out previous '==>' + lda #$01 + ldy #$0003 + os9 I$Write + leax >L0693,pc Print '==>' + ldy #$0003 + os9 I$Write +L3090 lbsr L2AC5 + cmpa #$08 + bne L30A7 +L3097 lda <u0092 + cmpa #$0F + bhi L30A3 + adda #$0F +L3100 sta <u0092 + bra L3047 + +L30A3 suba #$0F + bra L3100 + +L30A7 cmpa #$09 + beq L3097 +L30AD cmpa #$0C + bne L30CB + lda <u0092 + cmpa #$01 + beq L30C1 + suba #$01 + sta <u0092 + bra L3100 + +L30C1 lda >u0C98 + sta <u0092 + bra L3100 + +L30CB cmpa #$0A + bne L30E9 + lda <u0092 + cmpa >u0C98 + beq L30E1 + adda #$01 + sta <u0092 + bra L3100 + +L30E1 lda #$01 + sta <u0092 + bra L3100 + +L30E9 cmpa #$0D + bne L30F6 +L30ED leax >L048B,pc + lbsr L1B03 + puls pc,y,x,d + +L30F6 cmpa #$05 + bne L3090 + clr <u0092 + bra L30ED + +L3107 pshs y,x,a Clear out '==>' from previous menu selection + lda #$01 + leax >L0682,pc Write out 3 BSP/SPC's to Std Out + ldy #$0006 + os9 I$Write + puls pc,y,x,a + +L3118 pshs y,x,d + ldx #u13A9 + lda ,x + beq L3148 + ldb #$1B +L3124 lda ,x+ + decb + cmpa #'. + beq L3130 +L312B tstb + bne L3124 +L3148 comb + puls pc,y,x,d + +L3130 lda ,x+ + decb + cmpa #'a + bne L312B + lda ,x+ + decb + cmpa #'d + bne L312B + lda ,x+ + decb + cmpa #$E6 + bne L312B + clrb +L3146 puls pc,y,x,d + +L314B pshs y,x,d + lda <u0092 + deca + ldb #$20 32 bytes/entry + mul + ldx #u16B9 Point to ASCII receive buffer + leax d,x Point to proper entry + stx <u0093 Save ptr + ldx #u13A9 + leay >L0A31,pc Point to '/dd/sys/dial' +L3169 lda ,y+ Copy path to buffer + bmi L3171 Do until high bit set (terminates string) + sta ,x+ + bra L3169 + +L3171 suba #$80 Bump down to normal char + ldb #'/ Append slash to allow for filename + std ,x++ Save in buffer + tfr x,y + ldx <u0093 Get ptr back + ldb #$20 Up to 32 bytes max +L317D lda ,x+ + sta ,y+ + bmi L318A If hi bit, that was last one + decb Hit max size yet? + bne L317D No, continue moving + +L318A ldx #u13A9 Point to name of file to open + lda #READ. + os9 I$Open Open it + bcs L31CF Couldn't, print error message & exit + sta <u003D Save path to .ADF file + lbsr L24D1 Go clear out Search & Reply strings + lda #$01 + sta >u0D19 + lda #$1E + sta >u0D1A +L31A7 lda <u003D Get path to ADF file again + ldx #u13A9 Point to buffer + ldy #$0050 Get up to an 80 char line + os9 I$ReadLn + bcc L31BD Got it, go parse (?) + cmpb #E$EOF End of file error? + bne L31CF No, print error & exit +L31C1 lda <u003D EOF, get path + os9 I$Close Close the file + lbsr L118F Go update the status line + lbra L33E0 + +L31BD bsr L31D4 + bra L31A7 + +L31CF os9 F$PErr Print error, & exit +L31CD puls pc,y,x,d + +* Parse a line from ADF file +L31D4 pshs y,x,d Preserve regs + clra Current keyword being checked=0 + leay >L06D1,pc Point to keyword list +L31DB ldx #u13A9 Point to buffer + ldb #$03 Size of keyword=3 + inca On keyword 1 + os9 F$CmpNam + leay 3,y Point to next keyword + bcc L31ED Found match, skip ahead + cmpa #32 Done all 32 keywords? + blo L31DB No, keep checking +L31ED cmpa #31 Is it 32? + bhi L326F Yes, exit + leax 3,x Point past keyword + ldb ,x+ Get next char + cmpb #'= Is it an '='? + bne L326F No, exit +* Change to use DECA instead of repeated CMPA's + cmpa #$01 ADS (Auto Dial String)? + beq L3271 + cmpa #$02 BPS (Bits per second (Baud))? + lbeq L328A + cmpa #$03 ECH (Keyboard echo)? + lbeq L32A3 + cmpa #$04 HEK (Host Echo)? + lbeq L32B1 + cmpa #$05 TRM (Terminal Type) + lbeq L32BF + cmpa #$06 LNF (Line Feeds on in & outgoing text) + lbeq L32CE + cmpa #$07 XON (XON char) + lbeq L32E0 + cmpa #$08 XOF (XOFF char) + lbeq L32E9 + cmpa #$09 RTR (# of retries) + lbeq L32F3 + cmpa #$0A RPS (Time each entry lasts) + lbeq L32FD + cmpa #$0B PAR (Parity) + lbeq L3307 + cmpa #$0C CLK (Keyclick) + lbeq L3311 + cmpa #$0D WRD (Word Length) + lbeq L3320 + cmpa #$0E STP (Stop bits) + lbeq L3338 + cmpa #$16 KM1-8 (Keyboard macros) + lbls L3358 Go handle all of them + cmpa #$17 CNS (String to send on Connect) + lbeq L337E + cmpa #$1B SS1-4 (Search string for auto-login) + lbls L2508 Go handle them + cmpa #$1F RS1-4 (Reply strings for SSn's) + lbls L24E3 + cmpa #$20 RLF (Line feeds added to received text) + lbeq L3392 + cmpa #$21 TLF (Line feeds added to xmitted text) + lbeq L33A1 +L326F puls pc,y,x,d Restore & return + +L3271 ldy #u0CF2 + ldb #$20 Max size=32 bytes +L3277 lda ,x+ Get char + sta ,y+ Copy it + cmpa #C$CR End of line? + beq L3284 Yes, skip ahead + decb Hit max size? + bne L3277 No, keep copying + puls pc,y,x,d Restore & return + +L3284 clr ,y+ Append NUL + puls pc,y,x,d Restore & return + +L328A lbsr L33B0 + andb #%00000111 Just keep baud rate + lda >u0CA5 Get baud/word len/stop bits + anda #%11111000 Keep all but baud + sta >u0CA5 Save it + orb >u0CA5 Merge with B + stb >u0CA5 Save new baud rate + puls pc,y,x,d + +L32A3 lbsr L33B0 + tstb + beq L32AB + ldb #$01 +L32AB stb >u0CA7 Save echo type + puls pc,y,x,d + +L32B1 lbsr L33B0 + tstb + beq L32B9 + ldb #$01 +L32B9 stb >u0CB1 + puls pc,y,x,d + +L32BF lbsr L33B0 + cmpb #$03 + blo L32C8 + ldb #$02 +L32C8 stb >u0CA6 + puls pc,y,x,d + +L32CE lbsr L33B0 + tstb + beq L32D6 + ldb #$01 +L32D6 stb >u0CA8 + stb >u0CA9 + puls pc,y,x,d + +L32E0 lbsr L33B0 + stb >u0CAF Pause off character code + puls pc,y,x,d + +L32E9 lbsr L33B0 + stb >u0CB0 Pause on character code + puls pc,y,x,d + +L32F3 lbsr L33B0 + stb >u0D19 + puls pc,y,x,d + +L32FD lbsr L33B0 + stb >u0D1A + puls pc,y,x,d + +L3307 lbsr L33B0 + stb >u0CAC Save parity + puls pc,y,x,d + +L3311 lbsr L33B0 + tstb + beq L3319 + ldb #$01 +L3319 stb >u0CAA + puls pc,y,x,d + +L3320 bsr L33B0 + lda >u0CA5 + anda #%01001111 Keep baud rate + sta >u0CA5 Save it + orb >u0CA5 Mask in Word Len/Stop bits + stb >u0CA5 Save new result + puls pc,y,x,d + +L3338 bsr L33B0 + tstb + beq L3344 + cmpb #$80 + beq L3344 + puls pc,y,x,d + +L3344 lda >u0CA5 + anda #%01111111 Keep all but Stop bits + sta >u0CA5 + orb >u0CA5 Merge in stop bit setting + stb >u0CA5 + puls pc,y,x,d + +L3358 lda -2,x Get macro # + suba #$31 Convert ASCII 1-8 to binary 0-7 + cmpa #7 Make sure only 0-7 + bhi L337B Not, exit + ldb #$80 128 bytes reserved per key + mul + ldy #u0D1C Point to start of programmable keys buffer + leay d,y Point to appropriate key in table + ldb #$80 Max size allowed=128 bytes +L336B lda ,x+ Get char + cmpa #C$CR Hit end of line? + beq L3378 Yes, flag end with NUL & exit + sta ,y+ Save char + decb Past max size? + bne L336B No, keep copying + puls pc,y,x,d + +L3378 clrb Append NUL byte + std ,y Save CR & NUL +L337B puls pc,y,x,d Return + +L337E ldy #u131C + ldb #$80 +L3384 lda ,x+ + cmpa #C$CR Hit end? + beq L3378 Yes, append NUL & exit + sta ,y+ + decb + bne L3384 + puls pc,y,x,d + +L3392 bsr L33B0 + tstb + beq L339A + ldb #$01 +L339A stb >u0CA9 + puls pc,y,x,d + +L33A1 bsr L33B0 + tstb + beq L33A9 + ldb #$01 +L33A9 stb >u0CA8 + puls pc,y,x,d + +L33B0 lda 1,x + cmpa #$21 + blo L33D2 Space or control char, skip ahead + lda ,x + suba #$30 Convert to Binary # + cmpa #10 Possibly legit digit? + blo L33C0 + suba #$07 +L33C0 ldb #$10 + mul + lda 1,x + suba #$30 Convert to Binary # + cmpa #10 Possibly legit digit + blo L33CD Decimal digit, skip ahead + suba #$07 +L33CD sta 1,x + addb 1,x + rts + +L33D2 lda ,x + suba #$30 + cmpa #10 + blo L33DC + suba #$07 +L33DC tfr a,b + rts + +L33E0 tst >u0D19 + bne L33ED + clr >u131C + lbra L3533 + +L33ED lbsr L1CDE + ldd #$1403 + std >u0C8F + ldd #$2808 + std >u0C91 + lbsr L1C81 + leax >L04B1,pc Print to 'Count', 'Seconds', etc. + lbsr L1B03 + lbsr L23D0 Center text + leax >L04DB,pc Print 'Dialing' + lbsr L1B03 + lbsr L2FDE + leax >L04E5,pc CurXY @ 23,3 + lbsr L1B03 + ldb #$01 + stb >u139F + lbsr L354B + ldx #u0CF2 + clrb +L342A lda ,x+ + incb + cmpb #$20 + bhi L3434 + tsta + bne L342A +L3434 decb + bne L343E + clr >u131C + lbra L3533 + +L343E clra + tfr d,y + sty >u0CA1 +L3446 leax >L02DC,pc Write out 'ATH <CR>' to modem + ldy #$0004 + lda <u002B + os9 I$Write + ldx #$005A + lbsr L0F56 + lda <u002B Check if data waiting at modem + ldb #SS.Ready + os9 I$GetStt + bcc L346E + lbsr L2D2E + bcs L346E + clr <u0022 + bra L3473 + +L346E lda #$01 + sta <u0022 +L3473 lbsr L2D50 + ldy >u0CA1 + ldx #u0CF2 + lda <u002B + os9 I$Write + lbsr L2D50 + ldb #$FF + stb >u0CA4 +L348E lbsr L1B4E + sta >u0CA3 +L3495 tst <u0022 + beq L34A6 + lbsr L2DDD + bcc L3509 + lbsr L2E1E + bcs L34AB + bra L34DC + +L34A6 lbsr L2D2E + bcs L3509 +L34AB ldd #SS.KySns Get keysense byte from StdIn + os9 I$GetStt + cmpa #$80 + bne L34BC + clr >u131C + bra L3533 + +L34BC lbsr L1B4E + cmpa >u0CA3 + beq L3495 + inc >u0CA4 + leax >L04EA,pc + lbsr L1B03 + ldb >u0CA4 + bsr L354B + cmpb >u0D1A + blo L348E +L34DC inc >u139F + leax >L04E5,pc + lbsr L1B03 + ldb >u139F + bsr L354B + ldb >u0D19 + cmpb #$FF + lbeq L3446 + ldb >u139F + cmpb >u0D19 + lblo L3446 + clr >u131C + bra L3533 + +L3509 ldd #1*256+SS.Tone Send Tone to Std Out + ldx #$3F06 + ldy #$0D00 + os9 I$SetStt + ldy #$0E00 + os9 I$SetStt Send another one (higher frequency) + ldy #$0F00 + os9 I$SetStt Send another one (still higher frequency) + tst <u0072 + beq L3533 + inc <u0075 + lda <u0073 + sta <u0074 +L3533 lbsr L1BAD + lda <u003D Close disk file + os9 I$Close + tst >u131C + beq L3545 + lbsr L1A19 +L3545 lbsr L12B5 + puls pc,y,x,d + +L354B pshs x,d + ldx #u13A9 + clra +L3552 cmpb #$64 + blo L355B + subb #$64 + inca + bra L3552 + +L355B adda #$30 + sta ,x+ + clra +L3560 cmpb #10 + blo L3569 + subb #$0A + inca + bra L3560 + +L3569 adda #$30 + sta ,x+ + addb #$30 + stb ,x+ + ldx #u13A9 + ldy #$0003 + lda #$01 Write 3 bytes to Std Out + os9 I$Write + puls pc,x,d + +* Download a file processing (PgDn from command state) +L3580 leax >L048F,pc turn off cursor + inc >u0CA0 + lbsr L1B03 + ldd #$1C05 get start co-ordinates of overlay + std >u0C8F + ldd #$1907 get size of overlay + std >u0C91 + lbsr L1C81 place overlay + leax >L0734,pc print available protocols + lbsr L1B03 + lda #$04 get max # protocols + sta >u139E save it + ldb <u004B get last selected protocol + lbsr L1DB8 let user choose new protocol + lbsr L1CDE get rid of overlay window + leax >L048B,pc turn cursor back on + lbsr L1B03 + clr <u0046 clear ymodem batch flag + ldb >u0C84 get selected type + beq L35D6 ASCII, skip ahead + cmpb #$03 within max? + lbhi L0C5E no, go back to main loop + stb <u004B update last selected protocol + cmpb #$02 ZModem? + lbhi L1793 yes, do it + blo L3648 X/Ymodem, go do it + inc <u0046 flag Ymodem batch +* X/Ymodem (batch) file receive +L3648 pshs d,x,y Store regs + lbra L36F4 Go do X/Ymodem (w or w/o batch) + +L35D6 stb <u004B update last selected protocol + lbra L4233 go do ASCII Xfer + +* Upload a file (PdUp in main command state) +L35DF leax >L048F,pc point to CurOff + clr >u0CA0 + lbsr L1B03 turn cursor off + ldd #$1C05 + std >u0C8F + ldd #$1908 + std >u0C91 + lbsr L1C81 + leax >L07A5,pc Point to file send menu + lbsr L1B03 Print it + lda #$05 + sta >u139E + ldb <u004A + lbsr L1DB8 + lbsr L1CDE + leax >L048B,pc Cursor On + lbsr L1B03 + clr <u0046 + clr <u0045 + ldb >u0C84 + beq L363F + cmpb #$04 + lbhi L0C5E + stb <u004A + cmpb #$02 + blo L3648 + inc <u0045 + cmpb #$03 + blo L3648 + lbhi L1859 + inc <u0046 + bra L3648 + +L363F stb <u004A + lbra L4233 + +* Setup Serial path options & data for file Xfer's +L364D ldd #$FF00 + sta <u0042 + stb <u0069 + stb <u005F + stb <u004C + stb <u006A + stb <u0062 + stb <u0052 + stb <u009B + ldx #u13A9 + lda <u002B get path to modem + ldb #SS.Opt Get path options + pshs d + os9 I$GetStt get current settings + ldx #u13A9 point to buffer + lda PD.BAU-PD.OPT,x + anda #$0F + sta PD.BAU-PD.OPT,x + lda PD.PAR-PD.OPT,x + anda #$03 + sta PD.PAR-PD.OPT,x + clra + clrb + std PD.XON-PD.OPT,x + std PD.EKO-PD.OPT,x + puls d restore path & option + os9 I$SetStt set new path options + lda >u0CB0 + ldb >u0CAF + pshs d + clra + sta >u0CAF + sta >u0CB0 + lbsr L43CA + puls d + sta >u0CB0 + stb >u0CAF + ldd #0 + std <u0009 + ldd #$1504 get start co-ordinates of xfer overlay + std >u0C8F + ldd #$2509 get size + std >u0C91 + lbra L1C81 place xfer overlay window + +L36CD pshs y,x,d +L36CF lbsr L3BBC +L36D2 lda <u002B Check if data ready on modem + ldb #SS.Ready + os9 I$GetStt + bcc L36E5 Maybe, go check it out + lbsr L3BDA + cmpa #$02 + blo L36D2 + puls pc,y,x,d + +L36E5 clra + tfr d,y # bytes received to Y + lda <u002B Get path to modem + ldx #u13A9 Point to modem receive buffer + os9 I$Read Read in the data + bra L36CF + +* X/Ymodem (batch) file receive +L36F4 lbsr L364D setup path options to modem for download + leax >L04EF,pc point to 'Xmodem file Xfer...' + lbsr L1B03 print it + tst <u0046 ymodem batch? + beq L370A no, skip ahead + leax >L0511,pc point to 'Y' + lbsr L1B03 print it +L370A leax >L052F,pc point to '<Break> aborts' + lbsr L1B03 print it + tst <u0046 ymodem batch? + beq L371F no, skip ahead + leax >L048F,pc turn cursor off + lbsr L1B03 + bra L376A skip to + +* Get filename for X/Ymodem receive +L371F leax L055F,pc point to 'File:' + lbsr L1B03 print it + lbsr L455D scan for old filename + tst <u009B filename already present? + beq L3742 no, skip ahead + ldx #u009F point to name + ldy #$0020 get length + lda #$01 print it + os9 I$WritLn + ldd #$0704 position cursor back to start of input prompt + lbsr L2294 +L3742 ldb #$1E get max length of name + lbsr L1B61 get it from user + tst <u0021 + lbne L3954 + leax L045E,pc clear the screen + lbsr L1B03 + leax L04EF,pc point to 'Xmodem file transer system' + lbsr L1B03 print it + tst <u0046 ymodem batch? + beq L3772 no, skip ahead + leax L0511,pc point to 'Y' + lbsr L1B03 print it + bra L3772 skip ahead + +L376A tst >u0CA0 Up/Download? + lbeq L3F08 +* NOTE: SHOULD CHANGE TO USE BILL'S SS.FILL CALL TO ALLOW EDITING OF 'GUESSED' +* FILENAME +L3772 ldy #u060E point to user entered filename + ldx #u009F point to old filename buffer + lda ,y get the first character + cmpa #C$CR user just hit enter? + bne L378A no, skip ahead + tst <u009B was there a old filename? + lbeq L3954 no, skip ahead + bra L378F + +L378A ldb #$20 get length of name + lbsr L2D26 move it to old filename buffer +L378F tst >u0CA0 Upload? + lbeq L3F08 Yes, go do + tst <u0046 Download; Batch? + bne L37C9 yes, have to get filename from sender + leax L056B,pc point to 'Recv:' + lbsr L1B03 print it + lda #$01 print the filename + ldx #u009F + ldy #$0020 + os9 I$WritLn + leax L048F,pc turn off cursor + lbsr L1B03 + lda #WRITE. get file mode + ldb #$03 get attributes + ldx #u009F Point to filename + os9 I$Create create file + lbcs L3965 + sta <u0042 save path # +L37C9 ldd <u0004 Get Start address of receive buffer + std <u0006 Make it ptr to end of receive buffer too + leax L0593,pc point to 'Block # ... Error #' + lbsr L1B03 print it + leax L05B7,pc point to 'Last Error:' + lbsr L1B03 print it + leax L052F,pc point to '<Break> aborts' + lbsr L1B03 print it + lbsr L3E83 print '0000' for + lbsr L3E9B print '0000' for + tst <u0046 Batch? + beq L37F8 no, skip ahead +L37ED lbsr L3E83 print '0000' for + lbsr L3E9B print '0000' for + ldd #$0000 Set current block # to 0 (for batch name block) + bra L37FE skip ahead + +* Main X/Ymodem transfer loop +L37F8 lbsr L3EDD print ??? + ldd #1 Set current block # to 1 +L37FE std <u0053 Save current block # + leax L06C7,pc CurXY @ 16,1 & print 5 spaces + lbsr L1B03 print it + ldd #$0D07 get cursor coords for error messages + lbsr L2294 move there + leax L05C7,pc Point to table of error messages for download + lda #$01 To Std Out + ldy #$0014 All error messages are 20 bytes (default=20 spaces + os9 I$Write + inc <u005A + ldb #$04 get # attempts for CRC mode + stb <u0059 save it as a counter +* Try 4 attempts to recieve using CRC +L3823 lbsr L3E73 send 'C' to host + dec <u0059 decrement attempt count + lbsr L3BBC update timeout time +L382C lda <u002B get path to modem + ldb #SS.Ready + os9 I$GetStt any data? + bcc L38A3 yes, skip ahead + lbsr L29EB No, go check if user hit <BREAK> to abort + lbcs L3992 Yes, abort transfer + lbsr L3BDA get # seconds + cmpa #$03 timeout? + blo L382C no, try again + tst <u0059 any attempts left? + bne L3823 yes, try again + clr <u005A ??? +L384C lbsr L3E7F Send NAK code to modem + lbsr L3BBC Update timer stuff +* Try 10 attempts to initiate CheckSum +L3852 lda <u002B get path to modem + ldb #SS.Ready + os9 I$GetStt Any data waiting? + bcc L38A3 Yes, skip ahead + lbsr L29EB No, go check if user hit <BREAK> to abort + lbcs L3992 Yes, go abort transfer + lbsr L3BDA get # seconds waiting + cmpa #10 timeout? + blo L3852 no, try again + inc <u0052 Inc # attempts at checksum + lbsr L3EC5 ??? Update some counter + lbsr L1CF7 ??? (resets default colors to terminal type) + lda <u0052 Get current # attempts @ checksum + cmpa #10 Done 10 of them? + blo L384C No, keep trying + lbra L3992 Yes, abort transfer + +L387D ldd <u0053 Get current block # of xfer + bne L388E There is one, skip ahead + lbsr L3E7B Send ACK to modem + lbsr L3E73 Send 'C' (for CRC mode) to modem + bra L3891 + +L388E lbsr L3E7B Send ACK to modem +L3891 ldd <u0053 Bump block # up 1 + addd #$0001 + std <u0053 + lbsr L3EDD Update block # on screen + clr <u0052 Clear Checksum attempt count + lbsr L3EB3 Print '0000' (for block #'s?) + +* Data waiting on modem comes here +L38A3 lbsr L29EB check for keyboard data + lbcs L3992 got something, abort xfer + clr <u00E2 Clear 4th byte of modem buffer + lbsr L39F1 Go do the download (?) + pshs cc Save error status + ldd <u0053 Get current block # + bne L38C7 Not header block, skip ahead + tst <u00E2 Check 4th byte in buffer + bne L38CD + puls cc Restore error from download + lbra L3992 Abort xfer + +L38CD puls cc Restore error from download + bcc L387D None, go send ACK/'C' to modem + lda #C$CR Error, reset previous dload filename to CR + sta <u009F + lbra L3992 Abort xfer + +L38C7 puls cc + bcs L38EC +L38DA tst <u005F + bne L38FD + tst <u0062 + beq L387D + clr <u0062 + lbsr L3E7B + bra L38A3 Go check keyboard/modem again + +L38EC lda <u0052 Get current # attempts @ checksum + cmpa #$09 Already have more than 9? + lbhi L3992 Too many errors, abort xfer + lbsr L36CD + lbsr L3E7F Send NAK to modem + bra L38A3 + +* Current file xfer is done +L38FD tst <u0046 Batch mode on? + beq L3941 No, skip ahead +* Batch mode xfer done + lbsr L3E7F Send NAK to modem + lbsr L39F1 Go read block (for filename) + clr <u005F + tst <u004C + bne L392D + ldd <u005B Get MSW of file size + bne L391C Definately not 0 length, go resize + ldd <u005B+2 Get LSW of file size + beq L392D 0 byte file, don't pre-extend +L391C lda <u0042 Get path to download file + ldb #SS.Size Re-size file to exact size from Batch header + ldx <u005B + ldy <u005B+2 + tfr y,u + os9 I$SetStt +L392D lda <u0042 Close the download file (???) + os9 I$Close + lda #C$CR Reset old filename to CR + sta <u009F + lbsr L3E7B Send ACK to modem + lbra L37ED Reprint Block & Error #'s to '0000' + +* Non-batch mode goes here +L3941 clr <u005F + lbsr L3E7B Send ACK to modem +L3947 clr >u0CA0 ??? Set xmit/recv flag to xmit??? + lbsr L1D09 Go sound a tone + lda <u0042 Get path to dload file + os9 I$Close Close it +L3954 lbsr L118F Go update the status line + lbsr L1CDE Remove overlay windows + clr <u0046 Clear Batch mode flag + puls y,x,d Restore regs + lbra L0C5E Go back to main (no file xfer) loop + +L3965 lda #$07 + lbsr L1F0B + pshs b + ldd #$0D02 + lbsr L2294 + lda #$03 + lbsr L1F0B + leax >L048F,pc Cursor OFF + lbsr L1B03 + puls b + os9 F$PErr Print Error + ldx #$003C + lbsr L0F56 + leax >L048B,pc Cursor ON + lbsr L1B03 + bra L3954 Go remove windows & exit xfer + +* Cancel file receive (comes here if key pressed) +L3992 lda <u009F get first char of filename + cmpa #C$CR anything? + beq L39AA no, skip delete + lda <u0042 get path to file + os9 I$Close close it +* NOTE: MAY WANT TO ADD USER OPTION TO KEEP WHATEVER WAS RECEIVED IN ABORTED +* XFER + ldx #u009F point to filename + os9 I$Delete delete it + lbsr L36CD purge any remaining data from modem +* Cancel file transfer +L39AA ldx #u13A9 point to temp buffer + ldd #$1804 CANcel code- 4 times +L39B2 sta ,x+ place in buffer + decb done? + bne L39B2 no keep going + ldd #$0304 Also add 4 <CTRL>-<C>'s +L39BB sta ,x+ place in buffer + decb done? + bne L39BB no, keep going + lda <u002B get path to modem + ldy #8 get # chars + ldx #u13A9 point to CAN string + os9 I$Write send it to host + bra L3947 Go close down xfer cleanly + +L39D1 lda #$04 Error # 4 (Time Out) + sta <u004F + lbra L3B83 + +L39D9 lda #$03 Error # 3 (Block check failed) + sta <u004F + lbra L3B83 + +L39E1 lda #$02 Error # 2 (Wrong Block #) + sta <u004F + lbra L3B83 + +L39E9 lda #$01 Error # 1 (Transfer aborted) + sta <u004F + lbra L3B83 + +* Read a block?? +L39F1 pshs y,x Preserve regs + ldd #$0000 + std <u004D Clear byte counter for dload + std <u0048 reset running CRC + sta <u0062 + sta <u004F Reset error # for xfer + sta <u005F + lbsr L3BBC ??? Something with timer (timeout check?) +L3A08 ldx #u00DF point to modem receive buffer +L3A0C lbsr L3BDA update timeout time + cmpa #10 timeout? + bhi L39D1 yes, skip ahead + lda <u002B get path to modem + ldb #SS.Ready any data? + os9 I$GetStt + bcs L3A0C no, wait for it + ldy #1 get # bytes needed +* NOTE: Attempted to eliminate lda <u002B (redundant from GetStt above) + os9 I$Read read the block header byte + bcs L3A0C error, try again + tfr y,d move # bytes to D + std <u004D save it + abx add LSB of it to buffer pointer + lda <u00DF get the header byte +* NOTE: Change to use DECA to speed up X&Ymodem header checks? + cmpa #$02 ymodem header? + beq L3A57 yes, get block size + cmpa #$01 xmodem header? + beq L3A52 yes, get block size + cmpa #$04 batch file header? + lbeq L3BAC yes, increment file count & process + cmpa #$18 CAN? + lbeq L3BB4 yes, cancel xfer + cmpa #$03 OS-9 CAN? + lbeq L3BB4 yes, cancel xfer + bra L3A08 garbage data, try again + +* Get XModem data block size +L3A52 ldd #$0080 128 bytes per block (Xmodem) + bra L3A5A + +* Get YModem data block size +L3A57 ldd #$0400 1024 bytes per block (Ymodem) +L3A5A std <u0057 save block size + ldy #u00E2 Get ptr to where data block will be (past header) + leay d,y Calculate end of block ptr + sty <u0050 Save it + orb #$04 add 4 to block size for header & checksum + tst <u005A CRC mode active? + beq L3A70 No, we have block size + orb #$01 add 1 to block size (for 2nd CRC byte) +L3A70 std <u0055 save true block size + lbsr L3BBC update timeout time + bra L3A81 Start getting blocks? + +L3A78 lbsr L3BDA Go update X/YModem timer + cmpa #2 Too long? + lbhi L39D1 Yes, TimeOut Error +L3A81 lda <u002B Any data ready on modem? + ldb #SS.Ready + os9 I$GetStt + bcs L3A78 No, do again + cmpb #$02 At least 2 chars? + blo L3A78 No, too small to bother, do again + ldy #$0002 Read 2 chars from modem + os9 I$Read Read in 2 chars + tfr y,d Move size read to D + abx Bump buffer ptr up past new data + addd <u004D Add to total # bytes gotten for this block + std <u004D Save updated counter + ldd <u0053 Get current block # + cmpb <u00DF+1 Compare with block # for X/Ymodem block + bne L3AB6 Error, skip ahead +L3AAC comb Compliment block # + cmpb <u00DF+2 Match compliment in block header? + beq L3AC2 Yes, header info is fine, skip ahead + lbra L39E1 Wrong Block # error + +* Block # error +L3AB6 decb Bump current block # down to previous one + cmpb <u00DF+1 Is that the one in the block header? + lbne L39E1 No, wrong block # error + inc <u0062 ??? + bra L3AAC Check compliment of block # too + +* Block # & it's compliment match in X/YModem block +L3AC2 lbsr L3BBC Do timing update +L3AC5 lbsr L3BDA Do timing sleep +* MAY WANT TO INCREASE THIS + cmpa #2 2 second difference? + lbhi L39D1 If more than 2 second wait, timeout error +L3ACE lda <u002B Any data ready on modem? + ldb #SS.Ready + os9 I$GetStt + bcs L3AC5 No, do again + clra + tfr d,y # bytes received into Y + lda <u002B Read in data from modem + os9 I$Read + bcs L3AC5 Error reading, try again + tfr y,d # bytes read to D + lbsr L3BBC Do timing update + tst <u005A CRC mode? + bne L3AF2 Yes, go update CRC + lbsr L3E3D Go update checksum + bra L3AF5 + +L3AF2 lbsr L3E0F update CRC +L3AF5 abx Add # bytes read to read ptr + addd <u004D Add # bytes in this I$Read to total #bytes so far + std <u004D for this block + cmpd <u0055 Got all the data we need for this block? + blo L3ACE No, keep reading data + ldx <u0050 + ldd <u0048 + tst <u005A + beq L3B16 + cmpd ,x +L3B10 beq L3B1A + lbra L39D9 + +L3B16 cmpa ,x + bra L3B10 + +L3B1A tst <u0062 + bne L3B7F + ldd <u0053 + bne L3B2F + lbsr L2860 + bcs L3B83 + puls pc,y,x + +L3B2F ldx #u00E2 + cmpd #$0001 + bne L3B79 + ldd <u0057 + lbsr L4206 + tst <u004C + beq L3B79 + pshs y,x,a + ldx #u009C + lda <u0089 + sta 2,x + ldy #$0003 + lda #$01 + os9 I$Write + leax >L06BF,pc Print 'ASCII' + ldy #$0008 + os9 I$Write + lda <u0087 + ldx #u009C + sta $02,x + ldy #$0003 + lda #$01 + os9 I$Write + puls y,x,a +L3B79 ldd <u0057 + lbsr L4191 +L3B7F clrb +L3B80 puls pc,y,x + +L3B83 inc <u0052 + lbsr L3EC5 + lbsr L1CF7 + ldd #$0D07 + lbsr L2294 + ldb #$14 Size of each error message + lda <u004F Get error # + beq L3BA9 0=none? + mul Calculate offset to proper error + leax >L05C7,pc Point to Download error list + leax d,x Point to specific error we want + lda #$01 Print it to the user + ldy #$0014 + os9 I$Write +L3BA9 comb + puls pc,y,x + +L3BAC inc <u005F + lbsr L41EC + puls pc,y,x + +L3BB4 lda #$0A + sta <u0052 + lbra L39E9 + +L3BBC tst <u0072 Is VRN running? + beq L3BCC No, use F$Time call + pshs d Preserve reg used + clra + ldb <u0073 Get # seconds from VRN timer + std <u0060 Save it + puls pc,d Restore D & return + +L3BCC pshs x,d Preserve regs + ldx #u0C99 Point to place to hold time packet + os9 F$Time Get current time + lda 5,x Get seconds + sta <u0060 Save it + puls pc,x,d Restore regs & return + +L3BDA pshs x,b Preserve regs + tst <u0072 Is VRN present? + beq L3BF3 No, use Clock + lda #$01 + ldb <u0073 Get VRN seconds counter + subd <u0060 Subtract last # seconds from VRN + tfr b,a A=# seconds between the 2 + ldx #$0001 1 tick to sleep + lbsr L0F56 Go check for/update onscreen timer & sleep 1 tick + puls pc,x,b Restore regs & return + +L3BF3 ldx #u0C99 Point to buffer for time packet + os9 F$Time Get current system time + lda 5,x Get # seconds + ldx #$0001 Sleep for 1 tick + os9 F$Sleep + adda #60 Add 60 to seconds + suba <u0060 Subtract # seconds from last check + cmpa #60 Hit 60 yet? + blo L3C0D No, restore regs & exit + suba #60 Yes, bump back down to real seconds +L3C0D puls pc,x,b Restore regs & return + +* Update running 16 bit CRC +* Entry: D=# bytes in block? +* X=Ptr to current position in read buffer? +L3E0F pshs d,x Preserve regs + leau d,x Point U to where end of block would be + stu <Temp Save in temp var + cmpx <u0050 We hit end of read buffer? + bhs L3E39 Yes, exit + leau <L3C0F,pc Point to CRC table +L3E24 ldb <u0048 Get 1st byte of current 16 bit CRC + clra Preload A for 16 bit # + eorb ,x+ EOR with byte from buffer + lslb Calculate offset to get CRC word from + rola + ldd d,u Get CRC word + eora <u0049 Update CRC + std <u0048 + cmpx <u0050 Hit end of read buffer yet? + beq L3E39 Yes, exit + cmpx <Temp Hit end of block yet? + blo L3E24 No, continue calculating CRC with next byte +L3E39 puls d,x,pc Restore regs & return + +* 16 bit CRC table +L3C0F fdb $0000,$1021,$2042,$3063,$4084,$50A5,$60C6,$70E7 + fdb $8108,$9129,$A14A,$B16B,$C18C,$D1AD,$E1CE,$F1EF + fdb $1231,$0210,$3273,$2252,$52B5,$4294,$72F7,$62D6 + fdb $9339,$8318,$B37B,$A35A,$D3BD,$C39C,$F3FF,$E3DE + fdb $2462,$3443,$0420,$1401,$64E6,$74C7,$44A4,$5485 + fdb $A56A,$B54B,$8528,$9509,$E5EE,$F5CF,$C5AC,$D58D + fdb $3653,$2672,$1611,$0630,$76D7,$66F6,$5695,$46B4 + fdb $B75B,$A77A,$9719,$8738,$F7DF,$E7FE,$D79D,$C7BC + fdb $48C4,$58E5,$6886,$78A7,$0840,$1861,$2802,$3823 + fdb $C9CC,$D9ED,$E98E,$F9AF,$8948,$9969,$A90A,$B92B + fdb $5AF5,$4AD4,$7AB7,$6A96,$1A71,$0A50,$3A33,$2A12 + fdb $DBFD,$CBDC,$FBBF,$EB9E,$9B79,$8B58,$BB3B,$AB1A + fdb $6CA6,$7C87,$4CE4,$5CC5,$2C22,$3C03,$0C60,$1C41 + fdb $EDAE,$FD8F,$CDEC,$DDCD,$AD2A,$BD0B,$8D68,$9D49 + fdb $7E97,$6EB6,$5ED5,$4EF4,$3E13,$2E32,$1E51,$0E70 + fdb $FF9F,$EFBE,$DFDD,$CFFC,$BF1B,$AF3A,$9F59,$8F78 + fdb $9188,$81A9,$B1CA,$A1EB,$D10C,$C12D,$F14E,$E16F + fdb $1080,$00A1,$30C2,$20E3,$5004,$4025,$7046,$6067 + fdb $83B9,$9398,$A3FB,$B3DA,$C33D,$D31C,$E37F,$F35E + fdb $02B1,$1290,$22F3,$32D2,$4235,$5214,$6277,$7256 + fdb $B5EA,$A5CB,$95A8,$8589,$F56E,$E54F,$D52C,$C50D + fdb $34E2,$24C3,$14A0,$0481,$7466,$6447,$5424,$4405 + fdb $A7DB,$B7FA,$8799,$97B8,$E75F,$F77E,$C71D,$D73C + fdb $26D3,$36F2,$0691,$16B0,$6657,$7676,$4615,$5634 + fdb $D94C,$C96D,$F90E,$E92F,$99C8,$89E9,$B98A,$A9AB + fdb $5844,$4865,$7806,$6827,$18C0,$08E1,$3882,$28A3 + fdb $CB7D,$DB5C,$EB3F,$FB1E,$8BF9,$9BD8,$ABBB,$BB9A + fdb $4A75,$5A54,$6A37,$7A16,$0AF1,$1AD0,$2AB3,$3A92 + fdb $FD2E,$ED0F,$DD6C,$CD4D,$BDAA,$AD8B,$9DE8,$8DC9 + fdb $7C26,$6C07,$5C64,$4C45,$3CA2,$2C83,$1CE0,$0CC1 + fdb $EF1F,$FF3E,$CF5D,$DF7C,$AF9B,$BFBA,$8FD9,$9FF8 + fdb $6E17,$7E36,$4E55,$5E74,$2E93,$3EB2,$0ED1,$1EF0 + +* Calculate Checksum? +* Entry: D=# bytes in block? +* X=Ptr to current position in read buffer? +* Y= +L3E3D pshs x,d Preserve regs + leau d,x Point U to where end of block would be + stu <Temp Save in temp var + cmpx <u0050 Hit end of read buffer? + beq L3E56 Yes, exit + lda <u0048 Get current Checksum +L3E4B adda ,x+ Add next byte + cmpx <u0050 Hit end of buffer? + beq L3E56 Yes, exit + cmpx <Temp Hit end of block? + blo L3E4B No, keep calculating Checksum +L3E56 sta <u0048 Save new checksum + puls pc,x,d Restore & return + +* Send ACK code for properly received packet +L3E7B lda #$06 get ACK code + +* Send single byte to modem +* Entry: A=Character to send +L3E6E sta <u0044 Save code to write + +* Send block response code (ex. ACK) +L3E5D pshs a,x,y preserve regs + ldx #u0044 point to 1 byte buffer for block responses + lda <u002B get path to modem + ldy #1 get length + os9 I$Write send it + puls a,x,y,pc restore & return + +L3E73 lda #'C get code for CRC mode + bra L3E6E send it to host + +L3E77 lda #$04 get end of transmission code + bra L3E6E send it to modem + +L3E7F lda #$15 get NAK code + bra L3E6E send it to modem + +L3E83 pshs d,x,y + leax >L062B,pc Point to '0000' packet # text with CurXY @ 8,5 + ldy #u1449 + ldb #$09 + lbsr L2D1E + ldx #u1449 + lbsr L1B03 + puls d,x,y,pc + +L3E9B pshs y,x,d + leax >L0634,pc Point to '0000' packet # text with CurXY @ 32,5 + ldy #u1439 + ldb #$09 + lbsr L2D1E + ldx #u1439 + lbsr L1B03 + puls pc,y,x,d + +L3EB3 pshs y,x,d + ldx #u1439 + ldd #$3030 '00' + std $05,x + std $07,x + lbsr L1B03 + puls pc,y,x,d + +L3EC5 pshs y,x,a + ldx #u1439 + bsr L3EEA + lbsr L1B03 + puls pc,y,x,a + +* ??? NEVER CALLED? +* pshs y,x,a +* leax >u1449,u +* lbsr L1B03 +* puls pc,y,x,a + +L3EDD pshs y,x,a + ldx #u1449 + bsr L3EEA + lbsr L1B03 + puls pc,y,x,a + +L3EEA pshs b + ldb #$08 +L3EEE bsr L3EF9 + cmpa #$30 + bne L3EF7 + decb + bcc L3EEE +L3EF7 puls pc,b + +L3EF9 lda b,x + inca + cmpa #$39 Higher than ASCII '9'? + bhi L3F03 + sta b,x + rts + +L3F03 lda #$30 Force to ASCII '0' + sta b,x + rts + +L3F08 tst <u0046 Check for YModem batch? + beq L3F1A + lbsr L2A52 + tst <u0021 + lbne L3954 +L3F17 lbsr L2AA0 +L3F1A leax >L0583,pc + lbsr L1B03 + ldx #u009F + lda #$01 + ldy #$0020 + os9 I$WritLn + leax >L048F,pc Cursor OFF + lbsr L1B03 + leax >L06C7,pc + lbsr L1B03 + lda #$01 + ldx #u009F + os9 I$Open + bcc L3F53 +L3F47 tst <u0046 + lbeq L3954 + inc <u0069 + bra L3F71 + +L3F53 sta <u0042 Save path # to download file + ldx #u00DF Read 127 bytes into buffer + ldy #$007F + os9 I$Read + bcs L3F47 Error, deal with it + tfr y,d + lbsr L4206 + lda <u0042 Get path # to download file + ldx #$0000 + os9 I$Seek +L3F71 leax >L0593,pc + lbsr L1B03 + leax >L052F,pc + lbsr L1B03 + lbsr L3E83 + lbsr L3E9B + tst <u004C + beq L3FB9 + ldx #u009C + lda <u0089 + sta $02,x + ldy #$0003 + lda #$01 + os9 I$Write + leax >L06BF,pc + ldy #$0008 + os9 I$Write + ldx #u009C + ldb <u0087 + stb $02,x + ldy #$0003 + os9 I$Write +L3FB9 clr <u005A Clear block check type to Checksum + ldd #$0080 128 bytes per block + std <u0057 Save X/YModem block size + addd #$0004 Add 4 bytes for header/trailer bytes + std <u0055 Save 'real' block size + tst <u0046 Batch mode? + lbne L40EA Yes, skip ahead + ldx #u13A9 + lbsr L2C72 + tst <u0045 + beq L3FE7 + ldd #$0400 Set block size to 1024 + std <u0057 + addd #$0004 Add 4 for header/trailer bytes + std <u0055 +L3FE7 ldd #$0001 Set current block # to 1 + std <u0053 + lbsr L3EDD + lbsr L3EB3 + lbsr L36CD + lbsr L2408 + tst <u0046 Batch mode? + beq L4007 No, skip ahead + ldd <u0053 Get block # + cmpd #$0001 Block #1 (info block)? + beq L4017 Yes, skip ahead +L4007 lbsr L2A15 + lbcs L39AA + cmpa #$43 + beq L4017 + lbsr L249F + bra L4031 + +L4017 lda #$01 Set to CRC checking + sta <u005A + lbsr L249F + ldd <u0057 Get block size + addd #$0005 Add 5 for header/trailer (CRC) + std <u0055 Save as 'real' block size + bra L4041 + +L402A lbsr L2A15 + lbcs L39AA +L4031 cmpa #$15 NAK (bad block)? + beq L4041 Yes, bump up retry ctr & see if time to quit + cmpa #$06 ACK (good block)? + beq L4070 Yes, skip ahead + cmpa #$18 <CTRL>-<X> to abort Xfer? + lbeq L39AA Yes, go abort + bra L4007 + +* Send X/Ymodem block & retry counter routine +L4041 inc <u0052 Bump up # attempts @ checksum + lda <u0052 Get it + cmpa #$09 Past 10? + lbhi L39AA Yes, forget it + cmpa #$01 1st try? + bne L405A No, skip ahead + ldd <u0053 Get current block # + cmpd #$0001 First block? + beq L4060 Yes, skip ahead +L405A lbsr L3EC5 ??? Update retry count + lbsr L1CF7 Send out a tone +L4060 ldy <u0055 Get true block size + lda <u002B Get path to modem + ldx #u00DF Get ptr to modem buffer + os9 I$Write Send out the block + bra L402A + +* Good block sent goes here +L4070 clr <u0052 Clear out retry attempts to 0 + lbsr L3EB3 Go update block # on screen + tst <u005F + bne L40BE + ldd <u0053 Get current block # + addd #$0001 Add 1 to it + std <u0053 Save mew block # + tst <u0045 + beq L409F + ldd #$0400 Set block size to 1024 + std <u0057 +* SHOULD BE ABLE TO CHANGE TO ADD #4, THEN DO CHECK AND ADD 1 MORE IF CRC + tst <u005A CRC? + beq L4099 No, skip ahead + addd #$0005 'Real' block size is 1029 + bra L409C + +L4099 addd #$0004 'Real' block size is 1028 for checksum +L409C std <u0055 Save real block size +L409F lbsr L3EDD + lbsr L2408 + tst <u005F + bne L40BE + lbsr L249F + lda <u002B Get path # to modem + ldx #u00DF Point to xmit buffer + ldy <u0055 Get size of buffer + os9 I$Write Send next block to modem + lbra L402A + +L40BE lda <u0042 Get path # to upload file + os9 I$Close Close it + clr <u005F + tst <u0046 Batch xfer? + beq L40D8 No, we're done + lbsr L3E77 + lbsr L2A15 + lbcs L39AA + lbra L3F17 + +L40D8 lbsr L3E77 + lbsr L2A15 + lbcs L39AA + cmpa #$06 + bne L40D8 + lbra L3947 + +L40EA lbsr L2A15 + lbcs L39AA + cmpa #'C CRC mode requested? + bne L40EA No, go back + inc <u005A Set mode to CRC + ldd <u0057 Get block size + addd #$0005 'Real' block size + std <u0055 Save 'Raw' block size + ldd #$0000 Set current block # to 0 + std <u0053 + lbsr L2408 + lbsr L249F + ldx #u00DF + ldy #u13A9 + ldb #$86 + lbsr L2D1E + tst <u0069 + bne L412F + ldd #$0001 Set block # to 1 + std <u0053 + ldd #$0400 Set block size to 1024 + std <u0057 + lbsr L2408 + lbsr L249F +L412F lda <u002B Get path # to modem + ldx #u13A9 + ldy <u0055 Get 'raw' block size + os9 I$Write +L413D lbsr L2A15 + lbcs L39AA + cmpa #$06 + beq L415C + cmpa #$15 + bne L413D + inc <u0052 Update retry counter + lda <u0052 + cmpa #$09 + lbhi L39AA + lbsr L3EC5 + lbsr L1CF7 + bra L412F + +L415C tst <u0069 + lbne L3954 + ldd #$0001 Set block # to 1 + std <u0053 + lbsr L3EDD + ldd <u0057 Get block size + addd #$0005 New size for CRC header/trailer + std <u0055 Save 'raw' block size + lbsr L2A15 + lbcs L39AA + cmpa #'C CRC mode requested? + bne L415C + lda <u002B Get path to modem + ldx #u00DF + ldy <u0055 Get raw block size + os9 I$Write Send to modem + lbra L402A + +L4191 pshs y,d + ldd <u0002 Get ptr to max address of receive buffer allowed + subd ,s + cmpd <u0006 Compare with end of current receive buffer + bhs L419E + bsr L41EC +L419E ldy <u0006 + tst <u004C + bne L41BC +L41A6 ldd ,x++ + std ,y++ + ldd ,s + subd #$0002 + std ,s + bhi L41A6 + beq L41B7 + leay -1,y +L41B7 sty <u0006 + puls pc,y,d + +L41BC ldd ,x++ + cmpa #$1F + bhi L41CA + cmpa #$0A + beq L41CC + cmpa #$1A + beq L41CC +L41CA sta ,y+ +L41CC cmpb #$1F + bhi L41D8 + cmpb #$0A + beq L41DA + cmpb #$1A + beq L41DA +L41D8 stb ,y+ +L41DA ldd ,s + subd #$0002 + std ,s + bhi L41BC + beq L41E7 + leay -1,y +L41E7 sty <u0006 + puls pc,y,d + +L41EC pshs x + ldx <u0004 Get ptr to start address of receive buffer + ldd <u0006 Get ptr to current end of receive buffer + subd <u0004 Calculate current size of receive buffer + tfr d,y Keep copy in Y + lda <u0042 Get path to download file + cmpa #$FF If none, skip ahead + beq L4200 + os9 I$Write Otherwise, write buffer to disk +L4200 ldd <u0004 Reset end of current buffer ptr to beginning + std <u0006 + puls pc,x + +L4206 pshs x,d + tst >u0CAD + beq L422E + inc <u004C + andb #$7F +L4213 lda ,x+ + bmi L422E + beq L4229 + cmpa #$1F + bhi L4229 + cmpa #$0D + beq L4229 + cmpa #$0A + beq L4229 + cmpa #$09 + bne L422E +L4229 decb + bne L4213 + puls pc,x,d + +L422E clr <u004C + puls pc,x,d + +* ASCII file download +L4233 ldd #$1504 + std >u0C8F + ldd #$2507 + std >u0C91 + lbsr L1C81 + leax >L048F,pc Cursor OFF + lbsr L1B03 + tst >u0CA0 + lbeq L444C + leax >L08CF,pc 'File Capture System' + lbsr L1B03 + leax >L051C,pc 'Break aborts' + lbsr L1B03 + leax >L048B,pc Cursor ON + lbsr L1B03 + tst <u0025 Does an ASCII receive file exist? + beq L42BE No, continue + leax >L0925,pc Print a double quote + lbsr L1B03 + ldx #u00BF + lda #$01 + ldy <u001E + leay -1,y + os9 I$Write Write filename + leax >L08E8,pc 'is already open' + lbsr L1B03 +* Loop for response to file already open +L428A lbsr L2AC5 + cmpa #'Y + beq L42A3 + cmpa #'N + lbeq L4332 + cmpa #$05 <CTRL>-<E>? + lbeq L4332 + cmpa #C$CR + bne L428A Illegal responses; ignore & try again + +L42A3 lbsr L43CA + lbsr L44E1 + lda <u002A Get path to file + os9 I$Close Close it + bcs L433B + clr <u0025 Clear flag that a receive file is open + clr <u0026 Clear flag that receive buffer is open + lbsr L237E + bra L4332 + +L42BE tst <u0020 + bne L42E7 + leax >L055F,pc 'File:' + lbsr L1B03 + ldb #$1E Max file size allowed? + lbsr L1B61 Go get filename from user + tst <u0021 + bne L4332 + ldd <u001C + std <u001E + ldx #u060E + ldy #u00BF + ldb #$20 + lbsr L2D1E +L42E7 ldx #u00BF + lda ,x + cmpa #$0D Carriage return? + beq L4332 + ldd #WRITE.*256+UPDAT. Access mode=Write, attributes=Read & Write + os9 I$Create Create the file + bcc L4318 + cmpb #E$CEF File aready exists error? + bne L433B + leax >L092B,pc Append or overwrite message + lbsr L1B03 +L4305 lbsr L2AC5 + cmpa #'A Append? + beq L4363 + cmpa #'O Overwrite? + beq L438A + cmpa #C$CR CR? + beq L4332 + bra L4305 + +L4318 sta <u002A Save path # to receive file +L431B inc <u0025 Flag that receive file exists + tst <u0024 + bne L4332 + inc <u0026 Flag that receive buffer is open + lbsr L237E + lda <u0002 Get MSB of max address for receive buffer + suba <u0006 Calc size to end of buffer (in 256 byte blocks) + sta <u0008 Save it + lbsr L44FF +L4332 clr <u0024 + lbsr L1CDE + lbra L0C5E + +L433B lda #$07 + lbsr L1F0B + pshs b + ldd #$0D02 + lbsr L2294 + leax >L048F,pc Cursor OFF + lbsr L1B03 + puls b + os9 F$PErr Print error message + ldx #$003C + lbsr L0F56 + leax >L048B,pc Cursor ON + lbsr L1B03 + bra L4332 + +L4363 ldx #u00BF + lda #UPDAT. + os9 I$Open + bcc L4379 + os9 F$PErr + ldx #$003C + lbsr L0F56 + bra L433B + +L4379 sta <u002A Save path # to receive file +* NOTE: TOOK OUT PSHS U + ldb #SS.Size Get size of file to append to + os9 I$GetStt + os9 I$Seek Seek to end of file +* NOTE: TOOK OUT PULS U + bra L431B + +L438A ldx #u00BF Delete file (to overwrite) + os9 I$Delete + lbra L42E7 + +L4394 pshs y,x,d + ldx #u070D + ldb <u0C89 Get LSB of size converted output text buffer + ldy <u0006 Get ptr to end of current receive buffer +L43A4 lda ,x+ + cmpa #$0A + beq L43AF + sta ,y+ + sty <u0006 +L43AF decb + cmpy <u0002 + bcs L43BA + bsr L43CA + ldy <u0006 +L43BA tstb + bne L43A4 + lda <u0002 + suba <u0006 + cmpa <u0008 + beq L43C8 + lbsr L44FF +L43C8 puls pc,y,x,d + +L43CA pshs y,x,d + ldd <u0006 + std <u0009 + tst <u0025 + beq L43FD + lda >u0CB0 Get pause on char + beq L43E1 None, wing it & hope we don't overflow + sta <u0044 Save it & send to modem + lbsr L3E5D +L43E1 ldd <u0006 + subd <u0004 + tfr d,y + ldx #u16B9 + lda <u002A Get path # to receive buffer file + os9 I$Write Save + lda >u0CAF Get pause off char + beq L43FD None, skip ahead + sta <u0044 Save & send to host + lbsr L3E5D +L43FD ldd <u0004 Reset end of receive buffer ptr to start + std <u0006 + puls pc,y,x,d + +* Parameter parsing? +L4403 pshs y,x,d + clr <u0024 + ldx ,u +L440A lda ,x+ + cmpa #C$CR + beq L4447 + cmpa #'f + beq L4418 + cmpa #'F + bne L440A +L4418 lda -$02,x + cmpa #C$SPAC + beq L4425 + cmpa #'- + bne L440A + inc <u0024 +L4425 lda ,x+ + cmpa #'= + bne L440A + ldy #u00BF + clrb +L4430 lda ,x+ + sta ,y+ + incb + cmpa #C$CR + beq L443D + cmpb #C$SPAC + blo L4430 +L443D clra + std <u001E + inc <u0020 + lbsr L4233 +L4447 clr <u0020 + puls pc,y,x,d + +L444C leax >L0910,pc 'Send ASCII file' + lbsr L1B03 + leax >L048B,pc Cursor ON + lbsr L1B03 + leax >L055F,pc 'File:' + lbsr L1B03 + ldb #$1E + lbsr L1B61 + tst <u0021 + bne L44CF + ldx #u060E + ldy #u13A9 + ldb #$20 + lbsr L2D1E + ldx #u13A9 + lda ,x + cmpa #C$CR + beq L44CF + lda #READ. + os9 I$Open + bcs L44CF + sta <u002C Save path # to file xmit in ASCII + lda #$01 + sta <u0023 + lbsr L1CDE +L4494 lda <u002C Get path # to send file + ldx #u13A9 Point to send buffer + ldy #255 Max 255 bytes/read + os9 I$ReadLn Get block from file + bcs L44C3 + lda <u002B Get path # to modem + ldx #u13A9 Send data to modem + os9 I$WritLn + lbsr L13C2 + bcc L44D4 + lbra L0C5E + +L44B6 ldx #$0004 + lbsr L0F56 + lda <u002B Get path to modem + ldb #SS.Ready + os9 I$GetStt Any data ready on the modem? + lbcc L0C5E Possibly, return to main read loop + bra L4494 No, go get more data from disk file + +L44C3 lda <u002C Close send file + os9 I$Close + clr <u0023 Clear 'Sending ASCII file' flag + lbra L0C5E + +L44CF lbsr L1CDE + lbra L0C5E + +L44D4 lbsr L2AC5 + cmpa #$03 + beq L44C3 + cmpa #$05 + beq L44C3 + lbra L0C5E + +L44E1 pshs y,x,d + ldx #u13A9 + ldd #$026A CurXY @ 74,0 + std ,x + ldd #$2020 +3 spaces + std $02,x + std $04,x + lda <u003E Get path # to status window + ldy #$0006 + os9 I$Write + puls pc,y,x,d + +L44FF pshs y,x,d + sta <u0008 + lsra + lsra + inca + ldx #u13A9 + clrb +L450B cmpa #10 + blo L4514 + suba #$0A + incb + bra L450B + +L4514 addb #$30 Convert to ASCII numeric + adda #$30 + cmpb #$30 + bne L451E + ldb #C$SPAC +L451E stb $03,x + sta $04,x + ldd #$026A CurXY @ 74,0 + std ,x + lda #$20 + sta $02,x + lda #$4B + sta $05,x + lda <u003E + ldy #$0006 + os9 I$Write + puls pc,y,x,d + +L453B pshs y,x,d + ldx #u070D + ldb <u0C89 Get # bytes in modem buffer + ldy <u000F +L4548 lda ,x+ + sta ,y+ + decb + cmpy <u000B + blo L4555 + ldy <u000D +L4555 tstb + bne L4548 + sty <u000F + puls pc,y,x,d + +* Scan filename memory for filename (used by file xfer's) +L455D pshs d,x,y + ldx <u000F get pointer to ??? +L4561 lda ,-x get a byte + cmpa #$2E period? + beq L4577 yes, skip ahead +L4567 cmpx <u000D end of buffer? + bne L456D no, check + ldx <u000B +L456D cmpx <u000F + bne L4561 + clr <u009B Clear filename present flag + puls d,x,y,pc +* +L4577 lda 1,x get character again + cmpa #'. + blo L4567 + lda -1,x + cmpa #'. + blo L4567 +L4583 lda ,-x + cmpa #'0 + blo L458F + cmpx <u000F + beq L456D + bra L4583 + +L458F lda 1,x + cmpa #'A + blo L456D + ldb #$1F + leax 1,x + ldy #u009F +L459D lda ,x+ +L459F cmpa #'. + blo L45B8 + sta ,y+ + decb + beq L45B8 + cmpx <u000B + beq L45B2 + cmpx <u000F ??? Hit end of name buffer? + bne L459D No, keep going + +L45B8 lda #C$CR Change to CR + sta ,y + inc <u009B Inc size of filename counter + puls d,x,y,pc Restore & return + +L45B2 lda ,x + ldx <u000D + bra L459F + + emod +eom equ * + end +