> GO/src v1.10 # Source for *GO by J.G.Harston  v1.00 28-Jun-1992 (0 v1.10 12-Feb-2017 Allows (addr) and [addr] 2: <OSARGS=&FFDA F. mcode% &200:load%=&FFFF0900:ver$="v1.10" P: Z/addr=&A8:lptr=&AC:tmp=&AE:off=&AF:tube=&27A d P=0 1 nP%=load%:O%=mcode% x[OPT P*3+4 .errSyntax 1BRK:EQUB 220:EQUS "Syntax: GO [()]":BRK : .go% &LDA #1:LDY #0:LDX #lptr:JSR OSARGS &LDA (lptr),Y:CMP #13:BEQ errSyntax STA off:INY -CMP #"(":BEQ ScanHex :\ *GO (addr) -CMP #"[":BEQ ScanHex :\ *GO [addr] -DEY:STY off :\ *GO addr : .ScanHex 8LDX #addr:LDA #0 :\ Prepare to scan hex :STA 0,X:STA 1,X :\ Clear hex accumulator STA 2,X:STA 3,X .GetHexNext "LDA (lptr),Y ,4CMP #"!":BCC GetHexDone :\ End of hex number 6CMP #")":BEQ GetHexDone @CMP #"]":BEQ GetHexDone J,CMP #"0":BCC errSyntax :\ Bad digit T0CMP #"9"+1:BCC GetHexDigit :\ Decimal digit ^.SBC #7:BCC errSyntax :\ Bad digit h,CMP #"@":BCS errSyntax :\ Bad digit r.GetHexDigit |=ASL A:ASL A:ASL A:ASL A :\ Move digit to top nybble 6STY tmp:LDY #4 :\ Four bits to move .GetHexMultiply >ASL A :\ Rotate current digit into DEY:BNE GetHexMultiply :\ Loop to move in four bits LDA tube:BPL EnterIO :\ No Tube, enter I/O memory @LDX addr+3:INX:BEQ EnterIO :\ &FFxxxxxx, enter I/O memory .TubeClaim /LDA #&C0+&10:JSR &406 :\ Claim Tube BCC TubeClaim -LDA off:BEQ TubeEnter :\ *GO addr =ASL A:PHA :\ b7=0 (addr), b7=1 [addr] &:LDA #0:JSR TubeStart:LDY #0 :\ Read bytes from CoPro 0.TubeGetWord : LDX #9 D<.TubeWait:DEX:BNE TubeWait :\ Delay between each byte NLDA addr+0,Y:STA addr+4,Y XLDA &FEE5:STA addr+0,Y b5INY:CPY #4:BNE TubeGetWord :\ Fetch four bytes l/TAX:PLA:BPL TubeEnter :\ *GO (addr) vFTXA:PHA:LDY #&FC:CLC :\ X=&00 if offset, X<>&00 if direct .TubeOffset LDX addr+8,Y 0, jump to addr ATXA:ADC addr+4,Y:TAX :\ addr?3=0, jump to addr+!addr  .TubeAddr STX addr+4,Y INY:BNE TubeOffset:PLA .TubeEnter BLDA #4 :\ Execute code and release Tube .TubeStart LDX #addr:LDY #0:JMP &406 :  .EnterIO =LDA off:BEQ EnterIOgo:ASL off :\ b7=0 (addr), b7=1 [addr]  LDY #1:LDA (addr),Y:TAX DEY:LDA (addr),Y:CLC  >BIT off:BPL IOAddr :\ (addr), store new address *;ADC addr+0:PHA:TXA :\ [addr], add to address 4ADC addr+1:TAX:PLA > .IOAddr HSTA addr+0:STX addr+1 R.EnterIOgo \=LDA #1:JMP (addr) :\ Enter code in I/O memory f: p EQUS ver$ z]: P"*SAVE GO "+~mcode%+" "+~O%+" "+~(go%&FFFF0000)+" "+~(load%&FFFF0000)