19781 > Mini65/srcTINTREM Source for Tiny 6502 Single-port Tube ClientTINTREM ===========
15677 =============================TINTREM This code may be freely
30053 sed, with acknowledgementsTINT:TINTREM Tiny 6502 Tube Client in 512 bytes.TINTREM Implements OSWRCH and OSRDCH via a si
25964 polled I/O port.TINTREM Optimised ACIA option selection.TINT:TINT:TINTREM BoilerplateTINTREM ===========TINTIF HIMEM
17990 FF:SYS "OS_GetEnv"TOA$:IFLEFT$(A$,
15932 "B6502":OSCLI"B6502"+MID$(A$,INSTR(A$
8736 ))TINTIF HIMEM>&FFFF:A$=MID$(A$,I
21076 (A$,"-")+6) ELSE A$=$&600TINTON ERROR REPORT:PRINT" at line ";ERL:ENDTINTDEFFNif(A%):
9537 :z%=-1:=opt% ELSE z%=P%:=opt%TINTDEFFNendif:IFz%=-1:=opt% ELSE z%=P%-
20538 %=P%-z%:O%=O%-z%:=opt%TINTDEFFNelse:
9594 =-1:z%=P%:=opt% ELSE z%=P%-z%:P%=P%-z%:O%=O%-z%:z%=-1:=opt%TINT:TINTREM
25965 and version, default valuesTINTREM ================================TINTver$="0.20":date$=" (11 Nov
12592 6)"
file$="Mini65":title$="Tiny 6502"
PORT=&FD
16698 CIA=6850 :REM I/O portTINTMEMBOT%=&800:M
20308 P%=&8000 :REM RAMTINTMAIN=&C000:load%=&FE00 :REM CodeTINTRDLINE%=TRUE:REM
28781 lement OSWORD 0TINTDIM mcode% &3FF, L% &40TINT:TINTREM Parse any command lineTINT
8269 ======================TINTA%=INSTR(A$," "):IF A%:A$=MID$(A$,A%+1) EL
16672 $=""TINTA%=INSTR(A$+" "," "):IF A$<>"":file$ =LEFT$(A$,A%-1):A$=MID
9281 ,A%+1)TINTA%=INSTR(A$+" "," "):IF A$<>"
28524 ad% =EVAL("&"+LEFT$(A$,A%-1)):A$=MID$(A$,A%+1)TINTA%=INS
16680 $+" "," "):IF A$<>"":MEMTOP%=EVAL("&"+LEFT$(A$,A%-1)):A$=MID$(A$,A%+1)TINTA%=INST
9281 +" "," "):IF A$<>"":MAIN =EVAL("&"
17989 T$(A$,A%-1)):A$=MID$(A$,A%+1)TINTA%=INSTR(A$+" "," "):IF A$<>"":PORT =EVA
9762 "+LEFT$(A$,A%-1)):A$=MID$(A$,A%+1)
A
20041 STR(A$+" "," "):IF A$<>"":ACIA =VAL(LEFT$(A$,A%-1)):A$=
9284 (A$,A%+1)TINTPRINT"Building ";file$TINTPRINT;ACIA;" ACIA at &";~PORTTINTPRINT"
21581 OP: ";~MEMTOP%
PRINT"CODE: ";~MAIN
PRINT"CLIENT: ";~load%
:
REM
29561 tem vectorsTINTREM ==============TINTUSERV=&200:BRKV =&202:IRQ1V=&204:IRQ2V=&206:CLIV
12838 08:BYTEV=&20ATINTWORDV=&20C:WRCHV=&20E:RDCHV=&210:FILEV=&212
18258 SV=&214:BGetV=&216TINTBPutV=&218:GBPBV=&21A:FINDV=&21C:FSCV =&21
22085 NTV=&220TINTLPTR=&F8:TEXT=&FA:IRQA=&FC:FAULT=&FD:ESCFLG=&
14858 TINTREM I/O values, these are suitable for a 6850TINTREM ===============
15677 ======================TINTIF ACIA=6850:TxStatus=PORT+0:TxRDY
21562 xData=PORT+1:RxControl=PORT+0:RxStop=&55TINTIF AC
13885 850:RxStatus=PORT+0:RxRDY=1:RxData=PORT+1:TxControl=PORT+0:Rx
29806 =&15TINTIF ACIA=6850:TxReset=0:RxInit=&13:TxInit=&55:TxDelay=0:REM &55=8N1, clock/16TINT:TINTREM I/O values, these s
27765 d be suitable for BenEater SBC 6551TINTREM ==========================================================TINTIF ACIA=
12597 :TxStatus=PORT+1:TxRDY=-64:TxData=PORT+0:RxContro
20304 RT+2:RxStop=&02TINTIF ACIA=6551:RxStatus=PORT+1:RxRDY=+08:Rx
24948 =PORT+0:TxControl=PORT+3:RxCont=&0BTINTIF ACIA=6551:TxReset=PORT+1:RxInit=&02:TxInit=&1E:TxDelay
13104 :REM TxDelay 9600 at 1MHzTINTIF ACIA=6551:title$=
28261 Eater"
:
REM Serial Tube system values
REM ===================
15677 ==TINTpfx=&9BTINT:TINT:TINTFOR P=0 TO 1:opt%=P*3+4TINTP%=load%:O%=mcode%
20559 T opt%TINT.LF800TINTJMP RESETTINT.PrBannerTINTJSR PrTextTINT.BANNERTINTEQUB 13:EQUS title$:EQUS " ":EQUS
9330 TINTEQUB 13:EQUB 0TINTRTSTINT:TINT\ Tube Client Startup CodeTINT\ ========================TINT.RESETTINTSEI:LDX #&35
8224 :\ Disable interupt
21038 ESETlp
16708 LFF00,X:STA &0200,X :\ Copy default vectorsTINTDEX:BPL RESETlp:TXS
14880 \ Clear stackTINTINX:STX ESCFLG
8224 :\ Clear Escape fla
2618 \ Init
26988 se I/O portTINTOPT FNif(TxReset)TINT STX TxResetTINTOPT FNendifTINTLDX #RxInit:STX RxControlTINTLDX #TxInit
22612 TxControlTINT:TINTCLI:JSR PrBanner:JSR OSNEWLTINTCLC:LDA #&01:JMP OSQUIT :\ Enter ma
28704 rogramTINT:TINT.osBYTETINTCMP #&7E:BNE osBYTE1 :\ Ack. EscapeTINTSTA ESCFLG:RTSTINT.osBYTE1TINTCMP #&83:BCC osBYTEexit
20557 #&85:BCS osBYTEexitTINTLDX #0:LDY #MEMBOT% DIV 256TINTROR A:BCS osBY
27503 TINTLDY #MEMTOP% DIV 256TINT.osBYTEokTINTROL ATINT.osBYTEexitTINTRTSTINT:TINTOPT FNif(
18764 NE%) :\ Perform RDLINE locallyTINT.osWORDTINTSTX LPTR+0:STY LP
12587 :\ LPTR=>control blockTINTTAY:BNE Word00Exit :\ OSWORD 0, jump to rea
26988 neTINTLDA (LPTR),Y:TAX:INYTINTLDA
21584 R),Y:STA LPTR+1TINTSTX LPTR+0:DEY :\ (LPTR)=>string buffer, Y=0TINT
29295 d00Lp1TINTJSR OSRDCH:BCS Word00Exit :\ Wait for characterTINTCMP #&7F:BNE Word00Char :\
29807 DeleteTINT.Word00DeleteTINTTYA:BEQ Word00Lp1 :\ Nothing to deleteTINTLDA #
14918 JSR OSWRCH :\ VDU 127TINT.Word00BackTINTDEY:JMP Wor
19504 p1 :\ Dec. counter, loop backTINT.Word0
24936 rTINTCMP #&08:BEQ Word00Delete :\ BS is also DeleteTINTCMP #&15:BNE W
12388 0Ins :\ Not Ctrl-UTINTTYA:BEQ Word00Lp1 :\ Nothing to deleteTINTLDA #&7FTINT.Word00Lp2TINTJSR OSWRCH:DEY
8224 :\ Delete charactersTINTBNE Wo
12336 Lp2TINTBEQ Word00Lp1 :\ Jump back to startTINT.Word00InsTINTSTA (LPTR),Y :\ Stor
26723 aracterTINTCMP #&0D:CLC:BEQ Wor
25392 r :\ Return - finishTINTCMP #&20:BCC Word00ctrl
14880 \ Control characterTINTINY:BEQ
25714 00Back :\ Too long, dec and go backTINT.Word00ctrlTINTJSR OSWRCH :\ Print characterTINT.Word00
2680 JMP Word00Lp1 :\ Loop for moreTINT.Word00crTINTJSR OSNEWL:CLC :\ Return with
11331 Y=lengthTINT.Word00ExitTINTRTSTINTOPT FNendifTINT:TINT\ Default error handler
15648 ====================TINT.ErrorHandlerTINTJSR OSNEWLTINTLDX FAULT+0:LDY FAULT+1TINTINX:BNE P%+3:INY
8224 :\ XY=>error stringTINTJSR
21330 TRNG :\ Print error stringTINT.HALTTINTBEQ HALT :
29779 op with EQ from PRSTRINGTINT:TINT\
29806 errupt handlersTINT\ ==================TINT.IRQHandlerTINTSTA IRQA:PLA:PHA
8224 :\ Save A, get flags from
24948 ckTINTAND #&10:BNE BRKHandler :\ If BRK, jump to BRK handlerTINTJMP (IRQ1V) :\ Continue via IRQ1V h
27748 erTINT.IRQ1HandlerTINTJMP (IRQ2V) :\ Pass on to IRQ2VTINT.BRKHandlerTINTTXA:PHA :\ S
8293 XTINTTSX:LDA &0103,X:CLD :\ Get address from stackTINTSEC:SBC #&01:STA FAULT+0TINTLDA &0104,XTINTSBC #&00:STA FAULT+1
8224 :\ &FD/E=>after BRK opcodeTINT
14913 TAX:LDA IRQA :\ Restore X, get saved ATINTCLI:JMP (BRKV)
8224 :\ Restore IRQs, jump to Err
18464 andlerTINT.IRQ2HandlerTINTLDA IRQA :\ Restore ATINT.NMIHandlerTINTRTI :\ Return f
8301 interuptTINT:TINT\ OSRDCH - Wait for character from input streamTINT\ =============================================TINT
28239 exit, A =char, Cy=Escape fl
11786 osRDCHTINTJSR WaitData:BNE osRDCH2 :\ Wait for characterTINTJSR WaitData :\ Wait for pref
25701 characterTINT.osRDCH2TINTCMP #27:BEQ osRDCH3 :\ Exit with CS if EscapeTINTCLC :\ CC if not Esc
2661 .osRDCH3TINTRTSTINT:TINT\ OSWRCH - Send character to output streamTINT\ ========================================TINT\ On en
11385 A =characterTINT.osWRCH :\ WRCH is simply SendByteTINT.SendByteTINTJSR SendData :\ Se
25120 yteTINTCMP #pfx:BNE SendByteDone :\ If not prefix, doneTINT\ :\ Fall through
8303 send againTINT:TINT:TINT\ *** LOW-LEVEL I/O CODE ***TINT\ ==========================TINT:TINT\ Send a raw byte of dataTINT\ ---------
11565 ----------TINT.SendDataTINTPHATINTOPT FNif(TxDelay
8224 LDA #T
27749 ay:SEC :\ 6551-style TxRDY bugfixTINT .SendWaitDelayTINT SBC
14897 BNE SendWaitDelayTINTOPT FNendifTINTO
17952 Nif(TxRDY)TINT .SendWaitTINT LDA TxStatus :\ Get StatusTINTOPT FNendifTINTOPT
26217 (TxRDY>0)TINT AND #TxRDY AND 255TINT BEQ SendWait :\ Wait until da
25376 an be sentTINTOPT FNendifTINTOPT FNif(TxRDY<0)TINT AND #-TxRDY AND 255TINT BNE SendWait :\
29801 until data can be sentTINTOPT FNendifTINTPLA:STA TxData :\ Send dataTINT.SendByteDoneTINTRTS
23562 Wait for raw dataTINT\ -----------------TINT\ On exit, EQ=p
26982 xTINT.WaitLoopTINTOPT FNif(RxControl)TINT LDA #RxCont:STA RxControl:\ Allow other end to sendTINTOPT FNendif
24919 itDataTINTLDA RxStatus:AND #RxRDYTINTBEQ WaitLoo
8224 :\ Wait for data
21584 FNif(RxControl)TINT LDA #RxStop:STA RxControl:\ Stop other endTINTOPT FNendifTINT.
29801 FetchTINTLDA RxData:CMP #pfx:RTS :\ EQ=prefixTINT:TINT:TINT\ Text I/O routinesTINT\ -----------------TINT.Pr
29816 TINTPLA:STA TEXT+0:PLA:STA TEXT+1 :\ TEXT=>embedded stringTINTJSR PrString2:JMP (TEXT) :\ Print st
26478 and jump back to codeTINT:TINT.PrStringTINTSTX TEXT+0:STY TEXT+1 :\ TEXT=>string at YXTINT.PrStringLpTINTLD
9763 00:LDA (TEXT),Y :\ G
25376 haracterTINTBEQ PrString2:JSR OSASCI :\ Print character if not &00TINT.PrString2TINTINC TEXT+0:BNE LFEA6:INC TEXT+1
18720 ncrement addressTINT.LFEA6TINTTAY:BNE PrStringLp :\ Loop back if not &00TINT:TINT.ScanHexTINT.I
17780 rrorTINT.UnsupportedTINT.NullReturnTINTRTSTINT:TINTOPT FNif(P%<&FF45)TINT.PrHexXYTINTTYA:JSR PrHex:TXATINT.PrHexTINTPHA:LSR A:LS
14913 LSR A:LSR ATINTJSR PrNybble:PLA
17486 #15TINT.PrNybbleTINTPHP:SED:CLC:ADC #&90:ADC #&40TINTPLP:JMP OSWRCHTINTO
17952 NendifTINT:TINT:TINT\ DEFAULT VECTOR TABLETINT\ ====================TINTOPT FNif(P%<&FF00)TINTEQUS
21076 ING$((&FF00-P%)AND255,CHR$255)TINTOPT FNendifTINT.LFF00TINTEQUW NullReturn :\ &200
21333 ERVTINTEQUW ErrorHandler :\
12848 - BRKVTINTEQUW IRQ1Handler :\ &204 - IRQ1VTINTE
8279 IRQ2Handler :\ &206 - IRQ2VTINTEQUW NullReturn :\ &208 - CLIVTINTEQUW osBYTE
8224 :\ &20A - BYTEVTINTOPT FNif
19524 INE%)TINTEQUW osWORD :\ &20C - WORDVTINTOPT FNelseTINTEQUW NullReturn :\
17200 - WORDVTINTOPT FNendifTINTEQUW osWRCH :\ &
8261 - WRCHVTINTEQUW osRDCH :\ &210 - RDCHV
21841 W NullReturn :\ &212 - FILEVTINTEQUW NullReturn :\ &214 -
21319 VTINTEQUW NullReturn :\ &216 - BGetVTINTEQUW NullReturn :\ &218 - BPutVTINTEQ
20000 ullReturn :\ &21A - GBPBVTINTEQUW NullReturn :\ &21C - FINDVTINTEQUW Unsupporte
8224 :\ &21E - FSCVTINTEQUW NullRe
28274 :\ &220 - EVNTVTINTEQUW Unsupported :\ &222 - UPTVTINTEQUW Unsupported :\ &224 - NETVTINTEQUW Unsupported
23610 &226 - VduVTINTEQUW Unsupporte
8224 :\ &228 - KEYVTINTEQUW Unsupp
25972 d :\ &22A - INSVTINTEQUW Unsupported :\ &22C - RemVTINTEQUW Unsupported :\ &22E - CNPVTINTEQUW NullReturn
8224 :\ &230 - IND1VTINTEQUW NullRet
8302 :\ &232 - IND2VTINTEQUW NullReturn :\ &234 - IND3VTINT:TINT:TINT\ Standard Tube entry pointsTINT\ =================
15677 =====TINTEQUS STRING$((&FF95-P%)AND255,CHR$255)TINT.LFF95 :JM
30030 llReturn :\ &FF95TINT.OSC
8260 :JMP RESET :\ &FF98TINT.PRSTRNG :JMP PrString :\ &FF9B
26994 nt ASCIIZ at YX, returns A=0, Y corruptedTINT.LFF9E :JMP NullReturn :\
14662 ETINT.SCANHEX :JMP NullReturn :\ &FFA1TINT.DISKACC :JMP NullReturn
8224 :\ &FFA4TINT.DISKCCP :JMP Nu
25938 turn :\ &FFA7TINTOPT FNif(PrHexXY<&FF45)TINT.PRHEX :JMP PrHex :\ &FFAA Print A in hex, A c
30066 ptedTINT.PR2HEX :JMP PrHexXY :\ &FFAD Print YX in hex, A corruptedTINTOPT FNelseTINT.PRHEX :JMP NullReturn
21072 2HEX :JMP NullReturnTINTOPT FNendifTINT.USERINT
19786 P NullReturn :\ &FFB0TINT.PRTEXT :JMP PrText
8224 :\ &FFB3 Print ASCIIZ inli
29728 ext, returns A=0, Y corruptedTINT.VECDEF :EQUB &36:EQUW LFF00 :\ &FFB6 Default vector tableTINT.OSQU
8224 :JMP MAIN :\ &FFB9 Quit current programTINT.OSERROR :JMP NullReturn
8224 :\ &FFBCTINT.OSINIT :JMP InitE
29295 :\ &FFBF Initialise MOS error handler, A corruptedTINT.DISKRST :JMP NullReturn :\ &FFC2TINT.LFFC5 :
8272 NullReturn :\ &FFC5TINT.NVRDCH :JMP osRDCH :\ &FFC8TINT.NVWRCH
19002 MP osWRCH :\ &FFCB
11786 OSFIND :JMP (FINDV) :\ &FFCETINT.OSGBPB :JMP (
16976 V) :\ &FFD1TINT.OSBPUT :JMP (BPutV) :\ &FFD4TINT.
18242 ET :JMP (BGetV) :\ &FFD7TINT.OSARGS :JMP (ARGSV) :\ &FFDATINT.OSF
8261 :JMP (FILEV) :\ &FFDDTINT:TINT.OSRDCH :JMP (RDCHV) :\ &FFE
20270 SASCI
19779 P #&0D:BNE OSWRCH :\ &FFE3TINT.OSNEWL :LDA #&0A:JSR OSW
8264 :\ &FFE7TINT.OSWRCR :LDA #&0D :\ &FFECTINT.OSWRCH :JMP
21079 CHV) :\ &FFEETINT.OSWORD :JMP
20311 RDV) :\ &FFF1TINT.OSBYTE :JMP
22850 TEV) :\ &FFF4TINT.OS_CLI :JMP
19523 IV) :\ &FFF7TINT:TINT.NMIV :E
8279 NMIHandler :\ &FFFA NMI VectorTINT.RESETV :EQUW RESET :\ &FFFC RES
22048 ectorTINT.IRQV :EQUW IRQHandler :\ &FFFE IRQ VectorTINT]:IF O%>L%:PRINT"ERROR
28483 de overrun":END
NEXT:PRINT "
26998 ng ";file$;
OSCLI "Save "+file$+" "+STR$~mcode%+" "+STR$~O%+" "+STR$~load%+" "+STR$~load%
PRI