OS SERIES 10 LAST PART GEOFF COX ****************************** LOAD ************************************* F9B4 TYA ;A=Y F9B5 BEQ &F9C4 ; F9B7 JSR &FA46 ; print message following call F9BA DB &0D ; F9BB DB 'Loading'; F9C2 DB &0D ; F9C3 BRK ; F9C5 STA &BA ;current block flag F9C6 LDX #&FF ;X=&FF F9C8 LDA &C1 ;Checksum result F9CA BNE &F9D9 ;if not 0 F9D9 F9CC JSR &FA72 ;else check filename header block matches searched ;filename if this returns NE then no match F9CF PHP ;save flags on stack F9D0 LDX #&FF ;X=&FF F9D2 LDY #&99 ;Y=&99 F9D4 LDA #&FA ;A=&FA this set Y/A to point to 'File?' FA99 F9D6 PLP ;get back flags F9D7 BNE &F9F5 ;report a query unexpected file name F9D9 LDY #&8E ;making Y/A point to 'Data' FA8E for CRC error F9DB LDA &C1 ;Checksum result F9DD BEQ &F9E3 ;if 0 F9E3 F9DF LDA #&FA ;A=&FA F9E1 BNE &F9F5 ;jump to F9F5 F9E3 LDA &03C6 ;block number F9E6 CMP &B4 ;current block no. lo F9E8 BNE &F9F1 ;if not eual F9F1 F9EA LDA &03C7 ;block number hi F9ED CMP &B5 ;current block no. hi F9EF BEQ &FA04 ;if equal FA04 F9F1 LDY #&A4 ;Y=&A4 F9F3 LDA #&FA ;A=&FA point to 'Block?' error unexpected block no. ;at this point an error HAS occurred F9F5 PHA ;save A on stack F9F6 TYA ;A=Y F9F7 PHA ;save Y on stack F9F8 TXA ;A=X F9F9 PHA ;save X on stack F9FA JSR &F8B6 ;print CR if indicated by current block flag F9FD PLA ;get back A F9FE TAX ;X=A F9FF PLA ;get back A FA00 TAY ;Y=A FA01 PLA ;get back A FA02 BNE &FA18 ;jump to FA18 FA04 TXA ;A=X FA05 PHA ;save A on stack FA06 JSR &F8A9 ;report FA09 JSR &FAD6 ;check loading progress, read another byte FA0C PLA ;get back A FA0D TAX ;X=A FA0E LDA &BE ;CRC workspace FA10 ORA &BF ;CRC workspace FA12 BEQ &FA8D ; FA14 LDY #&8E ;Y=&8E FA16 LDA #&FA ;A=&FA FA8E points to 'Data?' FA18 DEC &BA ;current block flag FA1A PHA ;save A on stack FA1B BIT &EB ;CFS Active flag FA1D BMI &FA2C ;if active FA2C FA1F TXA ;A=X FA20 AND &0247 ;filing system flag 0=CFS 2=RFS FA23 BNE &FA2C ; FA25 TXA ;A=X FA26 AND #&11 ; FA28 AND &BB ;current OPTions FA2A BEQ &FA3C ;ignore errors FA2C PLA ;get back A FA2D STA &B9 ;store A on &B9 FA2F STY &B8 ;store Y on &B8 FA31 JSR &F68B ;do *EXEC 0 to tidy up FA34 LSR &EB ;halve CFS Active flag to clear bit 7 FA36 JSR &FAE8 ;bell, reset ACIA & motor FA39 JMP (&00B8) ;display selected error report FA3C PLA ;get back A FA3D INY ;Y=Y+1 FA3E BNE &FA43 ; FA40 CLC ;clear carry flag FA41 ADC #&01 ;Add 1 FA43 PHA ;save A on stack FA44 TYA ;A=Y FA45 PHA ;save Y on stack FA46 JSR &E7DC ;check if free to print message FA49 TAY ;Y=A FA4A PLA ;get back A FA4B STA &B8 ;&B8=8 FA4D PLA ;get back A FA4E STA &B9 ;&B9=A FA50 TYA ;A=Y FA51 PHP ;save flags on stack FA52 INC &B8 ; FA54 BNE &FA58 ; FA56 INC &B9 ; FA58 LDY #&00 ;Y=0 FA5A LDA (&B8),Y ;get byte FA5C BEQ &FA68 ;if 0 Fa68 FA5E PLP ;get back flags FA5F PHP ;save flags on stack FA60 BEQ &FA52 ;if 0 FA52 to get next character FA62 JSR OSASCI ;else print FA65 JMP &FA52 ;and do it again FA68 PLP ;get back flags FA69 INC &B8 ;increment pointers FA6B BNE &FA6F ; FA6D INC &B9 ; FA6F JMP (&00B8) ;and print error message so no error condition ;occcurs ************ compare filenames ****************************************** FA72 LDX #&FF ;X=&FF inx will mean X=0 FA74 INX ;X=X+1 FA75 LDA &03D2,X ;sought filename byte FA78 BNE &FA81 ;if not 0 FA81 FA7A TXA ;else A=X FA7B BEQ &FA80 ;if X=0 A=0 exit FA7D LDA &03B2,X ;else A=filename byte FA80 RTS ;return ; FA81 JSR &E4E3 ;set carry if byte in A is not upper case Alpha FA84 EOR &03B2,X ;compare with filename FA87 BCS &FA8B ;if carry set FA8B FA89 AND #&DF ;else convert to upper case FA8B BEQ &FA74 ;and if A=0 filename characters match so do it again FA8D RTS ;return ; FA8E BRK ; FA8F DB &D8 ;error number FA90 DB 'Data' ; FA96 BRK ; FA97 BNE &FAAE ; FA99 BRK ; FA9A DB &DB ;error number FA9B DB 'File?' ; FAA1 BRK ; FAA2 BNE &FAAE ; FAA4 BRK ; FAA5 DB &DA ;error number FAA6 DB 'Block?' FAAD BRK ; FAAE LDA &BA ;current block flag FAB0 BEQ &FAD3 ;if 0 FAD3 else FAB2 TXA ;A=X FAB3 BEQ &FAD3 ;If X=0 FAD3 FAB5 LDA #&22 ;A=&22 FAB7 BIT &BB ;current OPTions checking bits 1 and 5 FAB9 BEQ &FAD3 ;if neither set no retry so FAD3 else FABB JSR &FB46 ;reset ACIA FABE TAY ;Y=A FABF JSR &FA4A ;print following message FAC2 DB &0D ;Carriage RETURN FAC3 DB &07 ;BEEP FAC4 DB 'Rewind Tape' ; FACF DW &0D0D ;two more newlines FAD1 BRK ; FAD2 RTS ;return FAD3 JSR &F24D ;print CR if CFS not operational FAD6 LDA &C2 ;filename length/progress flag FAD8 BEQ &FAD2 ;if 0 return else FADA JSR &F995 ;confirm ESC not set and CFS not executing FADD LDA &0247 ;filing system flag 0=CFS 2=RFS FAE0 BEQ &FAD6 ;if CFS FAD6 FAE2 JSR &F588 ;else set up ACIA etc FAE5 JMP &FAD6 ;and loop back again ********** sound bell, reset ACIA, motor off **************************** FAE8 JSR &E7DC ;check if free to print message FAEB BEQ &FAF2 ;enable second processor and reset serial system FAED LDA #&07 ;beep FAEF JSR OSWRCH ; FAF2 LDA #&80 ; FAF4 JSR &FBBD ;enable 2nd proc. if present and set up osfile block FAF7 LDX #&00 ; FAF9 JSR &FB95 ;switch on motor FAFC PHP ;save flags on stack FAFD SEI ;prevent IRQ interrupts FAFE LDA &0282 ;get serial ULA control register setting FB01 STA &FE10 ;write to serial ULA control register setting FB04 LDA #&00 ;A=0 FB06 STA &EA ;store A RS423 timeout counter FB08 BEQ &FB0B ;jump FB0B FB0A PHP ;save flags on stacksave flags FB0B JSR &FB46 ;release ACIA (by &FE08=3) FB0E LDA &0250 ;get last setting of ACIA FB11 JMP &E189 ;set ACIA and &250 from A before exit FB14 PLP ;get back flags FB15 BIT &FF ;if bit 7of ESCAPE flag not set FB17 BPL &FB31 ;then FB31 FB19 RTS ;else return as unserviced ESCAPE is pending ************************************************************************* * * * Claim serial system for sequential Access * * * ************************************************************************* FB1A LDA &E3 ;get cassette filing system options byte ;high nybble used for LOAD & SAVE operations ;low nybble used for sequential access ;0000 Ignore errors, no messages ;0001 Abort if error, no messages ;0010 Retry after error, no messages ;1000 Ignore error short messages ;1001 Abort if error short messages ;1010 Retry after error short messages ;1100 Ignore error long messages ;1101 Abort if error long messages ;1110 Retry after error long messages FB1C ASL ;move low nybble into high nybble FB1D ASL ; FB1E ASL ; FB1F ASL ; FB20 STA &BB ;current OPTions save into &BB FB22 LDA &03D1 ;get sequential block gap FB25 BNE &FB2F ;goto to &FB2F ************************************************************************* * * * claim serial system for cassette etc. * * * ************************************************************************* FB27 LDA &E3 ;get cassette filing system options byte ;high nybble used for LOAD & SAVE operations ;low nybble used for sequential access ;0000 Ignore errors, no messages ;0001 Abort if error, no messages ;0010 Retry after error, no messages ;1000 Ignore error short messages ;1001 Abort if error short messages ;1010 Retry after error short messages ;1100 Ignore error long messages ;1101 Abort if error long messages ;1110 Retry after error long messages FB29 AND #&F0 ;clear low nybble FB2B STA &BB ;as current OPTions FB2D LDA #&06 ;set current interblock gap FB2F STA &C7 ;to 6 FB31 CLI ;allow interrupts FB32 PHP ;save flags on stack FB33 SEI ;prevent interrupts FB34 BIT &024F ;check if RS423 is busy FB37 BPL &FB14 ;if not FB14 FB39 LDA &EA ;see if RS423 has timed out FB3B BMI &FB14 ;if not FB14 FB3D LDA #&01 ;else load RS423 timeout counter with FB3F STA &EA ;1 to indicate that cassette has 6850 FB41 JSR &FB46 ;reset ACIA with &FE80=3 FB44 PLP ;get back flags FB45 RTS ;return FB46 LDA #&03 ;A=3 FB48 BNE &FB65 ;and exit after resetting ACIA ********************** set ACIA control register ********************** FB4A LDA #&30 ;set current ACIA control register FB4C STA &CA ;to &30 FB4E BNE &FB63 ;and goto FB63 ;if bit 7=0 motor off 1=motor on ***************** control cassette system ******************************* FB50 LDA #&05 ;set &FE10 to 5 FB52 STA &FE10 ;setting a transmit baud rate of 300,motor off FB55 LDX #&FF ; FB57 DEX ;delay loop FB58 BNE &FB57 ; FB5A STX &CA ;&CA=0 FB5C LDA #&85 ;Turn motor on and keep baud rate at 300 recieve FB5E STA &FE10 ;19200 transmit FB61 LDA #&D0 ;A=&D0 FB63 ORA &C6 ; FB65 STA &FE08 ;set up ACIA control register FB68 RTS ;returnand return FB69 LDX &03C6 ;block number FB6C LDY &03C7 ;block number hi FB6F INX ;X=X+1 FB70 STX &B4 ;current block no. lo FB72 BNE &FB75 ; FB74 INY ;Y=Y+1 FB75 STY &B5 ;current block no. hi FB77 RTS ;return ; FB78 LDY #&00 ; FB7A STY &C0 ;filing system buffer flag *****************set (zero) checksum bytes ****************************** FB7C STY &BE ;CRC workspace FB7E STY &BF ;CRC workspace FB80 RTS ;return *********** copy sought filename routine ******************************** FB81 LDY #&FF ;Y=&FF FB83 INY ;Y=Y+1 FB84 INX ;X=X+1 FB85 LDA &0300,X ; FB88 STA &03D2,Y ;sought filename FB8B BNE &FB83 ;until end of filename (0) FB8D RTS ;return ; FB8E LDY #&00 ;Y=0 ********************** switch Motor on ********************************** FB90 CLI ;allow IRQ interrupts FB91 LDX #&01 ;X=1 FB93 STY &C3 ;store Y as current file handle ********************: control motor ************************************ FB95 LDA #&89 ;do osbyte 137 FB97 LDY &C3 ;get back file handle (preserved thru osbyte) FB99 JMP OSBYTE ;turn on motor ****************** confirm file is open ******************************** FB9C STA &BC ;file status or temporary store FB9E TYA ;A=Y FB9F EOR &0247 ;filing system flag 0=CFS 2=RFS FBA2 TAY ;Y=A FBA3 LDA &E2 ;CFS status byte FBA5 AND &BC ;file status or temporary store FBA7 LSR ;A=A/2 FBA8 DEY ;Y=Y-1 FBA9 BEQ &FBAF ; FBAB LSR ;A=A/2 FBAC DEY ;Y=Y-1 FBAD BNE &FBB1 ; FBAF BCS &FBFE ; FBB1 BRK ; FBB2 DB &DE ;error number FBB3 DB 'Channel' ; FBBA BRK ; ************* read from second processor ******************************** FBBB LDA #&01 ;A=1 FBBD JSR &FBD3 ;check if second processor file test tube prescence FBC0 BEQ &FBFE ;if not exit FBC2 TXA ;A=X FBC3 LDX #&B0 ;current load address FBC5 LDY #&00 ;Y=00 FBC7 PHA ;save A on stack FBC8 LDA #&C0 ;filing system buffer flag FBCA JSR &0406 ;and out to TUBE FBCD BCC &FBCA ; FBCF PLA ;get back A FBD0 JMP &0406 ; *************** check if second processor file test tube prescence ****** FBD3 TAX ;X=A FBD4 LDA &B2 ;current load address high word FBD6 AND &B3 ;current load address high word FBD8 CMP #&FF ; FBDA BEQ &FBE1 ;if &FF then its for base processor FBDC LDA &027A ;&FF if tube present FBDF AND #&80 ;to set bit 7 alone FBE1 RTS ;return ******** control ACIA and Motor ***************************************** FBE2 LDA #&85 ;A=&85 FBE4 STA &FE10 ;write to serial ULA control register setting FBE7 JSR &FB46 ;reset ACIA FBEA LDA #&10 ;A=16 FBEC JSR &FB63 ;set ACIA to CFS baud rate FBEF JSR &F995 ;confirm ESC not set and CFS not executing FBF2 LDA &FE08 ;read ACIA status register FBF5 AND #&02 ;clear all but bit 1 FBF7 BEQ &FBEF ;if clear FBEF FBF9 LDA #&AA ;else A=&AA FBFB STA &FE09 ;transmit data register FBFE RTS ;return FBFF BRK ;