************************************************************************* * * * OSBYTE DISPATCH TABLE * * * ************************************************************************* E5B3 DW &E821 ;OSBYTE 0 (&E821) OS Version E5B5 DW &E988 ;OSBYTE 1 (&E988) User flag E5B7 DW &E6D3 ;OSBYTE 2 (&E6D3) Input source E5B9 DW &E997 ;OSBYTE 3 (&E997) Output dests E5BB DW &E997 ;OSBYTE 4 (&E997) Cursor keys state E5BD DW &E976 ;OSBYTE 5 (&E976) Printer destination E5BF DW &E988 ;OSBYTE 6 (&E988) Printer ignore character E5C1 DW &E98B ;OSBYTE 7 (&E68B) Serial input baud E5C3 DW &E689 ;OSBYTE 8 (&E689) Serial output baud E5C5 DW &E6B0 ;OSBYTE 9 (&E6B0) E5C7 DW &E6B2 ;OSBYTE 10 (&E6B2) E5C9 DW &E995 ;OSBYTE 11 (&E995) E5CB DW &E98C ;OSBYTE 12 (&E98C) E5CD DW &E6F9 ;OSBYTE 13 (&E6F9) Disable event E5CF DW &E6FA ;OSBYTE 14 (&E6FA) Enable event E5D1 DW &F0A8 ;OSBYTE 15 (&F0A8) Flush buffer E5D3 DW &E706 ;OSBYTE 16 (&E706) E5D5 DW &DE8C ;OSBYTE 17 (&DE8C) E5D7 DW &E9C8 ;OSBYTE 18 (&E9C8) E5D9 DW &E9B6 ;OSBYTE 19 (&E9B6) E5DB DW &CD07 ;OSBYTE 20 (&CD07) Explode font E5DD DW &F0B4 ;OSBYTE 21 (&F0B4) Flush buffer E5DF DW &E86C ;OSBYTE 117 (&E86C) E5E1 DW &E9D9 ;OSBYTE 118 (&E9D9) E5E3 DW &E275 ;OSBYTE 119 (&E275) E5E5 DW &F045 ;OSBYTE 120 (&F045) E5E7 DW &F0CF ;OSBYTE 121 (&F0CF) E5E9 DW &F0CD ;OSBYTE 122 (&F0CD) E5EB DW &E197 ;OSBYTE 123 (&E197) E5ED DW &E673 ;OSBYTE 124 (&E673) Clear Escape state E5EF DW &E674 ;OSBYTE 125 (&E674) Set Escape state E5F1 DW &E65C ;OSBYTE 126 (&E65C) Acknowledge Escape E5F3 DW &E035 ;OSBYTE 127 (&E035) EOF E5F5 DW &E74F ;OSBYTE 128 (&E74F) ADVAL E5F7 DW &E713 ;OSBYTE 129 (&E713) INKEY E5F9 DW &E729 ;OSBYTE 130 (&E729) E5FB DW &F085 ;OSBYTE 131 (&F085) E5FD DW &D923 ;OSBYTE 132 (&D923) E5FF DW &D926 ;OSBYTE 133 (&D926) E601 DW &D647 ;OSBYTE 134 (&D647) E603 DW &D7C2 ;OSBYTE 135 (&D7C2) E605 DW &E657 ;OSBYTE 136 (&E657) E607 DW &E67F ;OSBYTE 137 (&E67F) E609 DW &E4AF ;OSBYTE 138 (&E4AF) Insert into buffer E60B DW &E034 ;OSBYTE 139 (&E034) E60D DW &F135 ;OSBYTE 140 (&F135) E60F DW &F135 ;OSBYTE 141 (&F135) E611 DW &DBE7 ;OSBYTE 142 (&DBE7) Select language E613 DW &F168 ;OSBYTE 143 (&F168) Service call E615 DW &EAE3 ;OSBYTE 144 (&EAE3) *TV E617 DW &E460 ;OSBYTE 145 (&E460) E619 DW &FFAA ;OSBYTE 146 (&FFAA) E61B DW &EAF4 ;OSBYTE 147 (&EAF4) E61D DW &FFAE ;OSBYTE 148 (&FFAE) E61F DW &EAF9 ;OSBYTE 149 (&EAF9) E621 DW &FFB2 ;OSBYTE 150 (&FFB2) E623 DW &EAFE ;OSBYTE 151 (&EAFE) E625 DW &E45B ;OSBYTE 152 (&E45B) E627 DW &E4F3 ;OSBYTE 153 (&E4F3) E629 DW &E9FF ;OSBYTE 154 (&E9FF) E62B DW &EA10 ;OSBYTE 155 (&EA10) E62D DW &E17C ;OSBYTE 156 (&E17C) E62F DW &FFA7 ;OSBYTE 157 (&FFA7) E631 DW &EE6D ;OSBYTE 158 (&EE6D) E633 DW &EE7F ;OSBYTE 159 (&EE7F) E635 DW &E9C0 ;OSBYTE 160 (&E9C0) Read VDU variable E637 DW &E99C ;OSBYTE 166+ Read/Write OSBYTE variable E639 DW &E659 ;OSWORD &E0+ ************************************************************************* * * * OSWORD DISPATCH TABLE * * * ************************************************************************* E63B DW &E902 ;OSWORD 0 (&E902) Read input line E63D DW &E8D5 ;OSWORD 1 (&E8D5) Read TIME E63F DW &E8E8 ;OSWORD 2 (&E8E8) Write TIME E641 DW &E8D1 ;OSWORD 3 (&E8D1) Read interval timer E643 DW &E8E4 ;OSWORD 4 (&E8E4) Write interval timer E645 DW &E803 ;OSWORD 5 (&E803) Read I/O memory E647 DW &E80B ;OSWORD 6 (&E80B) Write I/O memory E649 DW &E82D ;OSWORD 7 (&E82D) SOUND E64B DW &E8AE ;OSWORD 8 (&E8AE) ENVELOPE E64D DW &C735 ;OSWORD 9 (&C735) POINT E64F DW &CBF3 ;OSWORD 10 (&CBF3) Read character bitmap E651 DW &C748 ;OSWORD 11 (&C748) Read palette E653 DW &C8E0 ;OSWORD 12 (&C8E0) Write palette E655 DW &C5CE ;OSWORD 13 (&D5CE) Read graphics coordinates ************************************************************************* * * * OSBYTE 136 Execute Code via User Vector * * * * *CODE effectively * * * ************************************************************************* E658 LDA #00 ;A=0 ************************************************************************* * * * *LINE entry * * * ************************************************************************* E659 JMP (&0200) ;Jump via USERV ************************************************************************* * * * OSBYTE 126 Acknowledge detection of ESCAPE condition * * * ************************************************************************* E65C LDX #&00 ;X=0 E65E BIT &FF ;if bit 7 not set there is no ESCAPE condition E660 BPL &E673 ;so E673 E662 LDA &0276 ;else get ESCAPE Action, if this is 0 ;Clear ESCAPE ;close EXEC files ;purge all buffers ;reset VDU paging counter E665 BNE &E671 ;else do none of the above E667 CLI ;allow interrupts E668 STA &0269 ;number of lines printed since last halt in paged ;mode = 0 E66B JSR &F68D ;close any open EXEC files E66E JSR &F0AA ;clear all buffers E671 LDX #&FF ;X=&FF to indicate ESCAPE acknowledged ************************************************************************* * * * OSBYTE 124 Clear ESCAPE condition * * * ************************************************************************* E673 CLC ;clear carry ************************************************************************* * * * OSBYTE 125 Set ESCAPE flag * * * ************************************************************************* E674 ROR &FF ;clear bit 7 of ESCAPE flag E676 BIT &027A ;read bit 7 of Tube flag E679 BMI &E67C ;if set TUBE exists so E67C E67B RTS ;else RETURN ; E67C JMP &0403 ;Jump to Tube entry point ************************************************************************* * * * OSBYTE 137 Turn on Tape motor * * * ************************************************************************* E67F LDA &0282 ;get serial ULA control setting E682 TAY ;Y=A E683 ROL ;rotate left to get bit 7 into carry E684 CPX #&01 ;if X=1 then user wants motor on so CARRY set else ;carry is cleared E686 ROR ;put carry back in control RAM copy E687 BVC &E6A7 ;if bit 6 is clear then cassette is selected ;so write to control register and RAM copy ************************************************************************* * * * OSBYTE 08/07 set serial baud rates * * * ************************************************************************* ; on entry X=baud rate ; A=&07 receive -> &07 ; A=&08 transmit -> &38 ; ; *FX 8 entry point E689 LDA #&38 ; Convert 8 to &38 for *FX8 ; *FX 7 entry point E68B EOR #&3F ;convert to mask, rx 7 to &38, tx 8 to &07 E68D STA &FA ;store result E68F LDY &0282 ;get serial ULA control register setting E692 CPX #&09 ;is it 9 or more? E694 BCS &E6AD ;if so exit, return current ULA setting E696 AND &E9AD,X ;AND with byte from lookup table E699 STA &FB ;store it, %00abc000 for rx, &00000def for tx E69B TYA ;get current serial ULA register in Y into A E69C ORA &FA ;ORA with rx/tx mask, %st111xyz for rx, %stuvw111 for tx E69E EOR &FA ;toggle them to zero, %st000xyz for rx, %stuvw000 for tx E6A0 ORA &FB ;merge in lookup bits, %stabcxyz for rx, %stuvwdef for tx E6A2 ORA #&40 ;set bit 6 for serial, %x1abcxyz for rx, %s1uvwdef for tx ; ;not needed as table has bit 6 set, LE68B could be EOR #&7F E6A4 EOR &025D ;toggle bit 6 via cassette/RS423 flag E6A7 STA &0282 ;store serial ULA flag E6AA STA &FE10 ;and write to control register E6AD TYA ;put Y in A to return old contents in X E6AE TAX ;return old setting in X E6AF RTS ;and return OS SERIES VII GEOFF COX ************************************************************************* * * * OSBYTE 9 Duration of first colour * * * ************************************************************************* ;on entry Y=0, X=new value E6B0 INY ;Y is incremented to 1 E6B1 CLC ;clear carry ************************************************************************* * * * OSBYTE 10 Duration of second colour * * * ************************************************************************* ;on entry Y=0 or 1 if from FX 9 call, X=new value E6B2 LDA &0252,Y ;get mark period count E6B5 PHA ;push it E6B6 TXA ;get new count E6B7 STA &0252,Y ;store it E6BA PLA ;get back original value E6BB TAY ;put it in Y E6BC LDA &0251 ;get value of flash counter E6BF BNE &E6D1 ;if not zero E6D1 E6C1 STX &0251 ;else restore old value E6C4 LDA &0248 ;get current video ULA control register setting E6C7 PHP ;push flags E6C8 ROR ;rotate bit 0 into carry, carry into bit 7 E6C9 PLP ;get back flags E6CA ROL ;rotate back carry into bit 0 E6CB STA &0248 ;store it in RAM copy E6CE STA &FE20 ;and ULA control register E6D1 BVC &E6AD ;return old setting in X ************************************************************************* * * * OSBYTE 2 select input stream * * * ************************************************************************* ;on input X contains stream number E6D3 TXA ;A=X E6D4 AND #&01 ;blank out bits 1 - 7 E6D6 PHA ;push A E6D7 LDA &0250 ;and get current ACIA control setting E6DA ROL ;Bit 7 into carry E6DB CPX #&01 ;if X>=1 then E6DD ROR ;bit 7 of A=1 E6DE CMP &0250 ;compare this with ACIA control setting E6E1 PHP ;push flags E6E2 STA &0250 ;put A into ACIA control setting E6E5 STA &FE08 ;and write to control register E6E8 JSR &E173 ;set up RS423 buffer E6EB PLP ;get flags back E6EC BEQ &E6F1 ;if new setting different from old E6F1 else E6EE BIT &FE09 ;set bit 6 and 7 E6F1 LDX &0241 ;get current input buffer number E6F4 PLA ;get A back E6F5 STA &0241 ;store it E6F8 RTS ;and return ************************************************************************* * * * OSBYTE 13 disable events * * * ************************************************************************* ;X contains event number 0-9 E6F9 TYA ;Y=0 A=0 ************************************************************************* * * * OSBYTE 14 enable events * * * ************************************************************************* ;X contains event number 0-9 E6FA CPX #&0A ;if X>9 E6FC BCS &E6AE ;goto E6AE for exit E6FE LDY &02BF,X ;else get event enable flag E701 STA &02BF,X ;store new value in flag E704 BVC &E6AD ;and exit via E6AD ************************************************************************* * * * OSBYTE 16 Select A/D channel * * * ************************************************************************* ;X contains channel number or 0 if disable conversion E706 BEQ &E70B ;if X=0 then E70B E708 JSR &DE8C ;start conversion E70B LDA &024D ;get current maximum ADC channel number E70E STX &024D ;store new value E711 TAX ;put old value in X E712 RTS ;and exit ************************************************************************* * * * OSBYTE 129 Read key within time limit * * * ************************************************************************* ;X and Y contains either time limit in centi seconds Y=&7F max ; or Y=&FF and X=-ve INKEY value E713 TYA ;A=Y E714 BMI &E721 ;if Y=&FF the E721 E716 CLI ;else allow interrupts E717 JSR &DEBB ;and go to timed routine E71A BCS &E71F ;if carry set then E71F E71C TAX ;then X=A E71D LDA #&00 ;A=0 E71F TAY ;Y=A E720 RTS ;and return ; ;scan keyboard E721 TXA ;A=X E722 EOR #&7F ;convert to keyboard scan code, keeping bit 7 E724 TAX ;X=A E725 JSR &F068 ;then scan keyboard E728 ROL ;put bit 7 into carry E729 LDX #&FF ;X=&FF E72B LDY #&FF ;Y=&FF E72D BCS &E731 ;if bit 7 of A was set goto E731 (RTS) E72F INX ;else X=0 E730 INY ;and Y=0 E731 RTS ;and exit ********** check occupancy of input or free space of output buffer ******* ;X=buffer number ;Buffer number Address Flag Out pointer In pointer ;0=Keyboard 3E0-3FF 2CF 2D8 2E1 ;1=RS423 Input A00-AFF 2D0 2D9 2E2 ;2=RS423 output 900-9BF 2D1 2DA 2E3 ;3=printer 880-8BF 2D2 2DB 2E4 ;4=sound0 840-84F 2D3 2DC 2E5 ;5=sound1 850-85F 2D4 2DD 2E6 ;6=sound2 860-86F 2D5 2DE 2E7 ;7=sound3 870-87F 2D6 2DF 2E8 ;8=speech 8C0-8FF 2D7 2E0 2E9 E732 TXA ;buffer number in A E733 EOR #&FF ;invert it E735 TAX ;X=A E736 CPX #&02 ;is X>1 E738 CLV ;clear V flag E739 BVC &E73E ;and goto E73E count buffer E73B BIT &D9B7 ;set V E73E JMP (&022E) ;CNPV defaults to E1D1 ************* check RS423 input buffer ************************************ E741 SEC E742 LDX #&01 ;X=1 to point to buffer E744 JSR &E738 ;and count it E747 CPY #&01 ;if the hi byte of the answer is 1 or more E749 BCS &E74E ;then Return E74B CPX &025B ;else compare with minimum buffer space E74E RTS ;and exit ************************************************************************* * * * OSBYTE 128 READ ADC CHANNEL * * * ************************************************************************* ;ON Entry: X=0 Exit Y contains number of last channel converted ; X=channel number X,Y contain 16 bit value read from channe ; X<0 Y=&FF X returns information about various buffers ; X=&FF (keyboard) X=number of characters in buffer ; X=&FE (RS423 input) X=number of characters in buffer ; X=&FD (RS423 output) X=number of empty spaces in buffer ; X=&FC (Printer) X=number of empty spaces in buffer ; X=&FB (sound 0) X=number of empty spaces in buffer ; X=&FA (sound 1) X=number of empty spaces in buffer ; X=&F9 (sound 2) X=number of empty spaces in buffer ; X=&F8 (sound 3) X=number of empty spaces in buffer ; X=&F7 (Speech) X=number of empty spaces in buffer E74F BMI &E732 ;if X is -ve then E732 count spaces E751 BEQ &E75F ;if X=0 then E75F E753 CPX #&05 ;else check for Valid channel E755 BCS &E729 ;if not E729 set X & Y to 0 and exit (*BUG* should pass to ROMs) E757 LDY &02B9,X ;get conversion values for channel of interest Hi & E75A LDA &02B5,X ;lo byte E75D TAX ;X=lo byte E75E RTS ;and exit E75F LDA &FE40 ;read system VIA port B E762 ROR ;move high nybble to low E763 ROR ; E764 ROR ; E765 ROR ; E766 EOR #&FF ;and invert it E768 AND #&03 ;isolate the FIRE buttons E76A LDY &02BE ;get analogue system flag byte E76D STX &02BE ;store X here E770 TAX ;A=X bits 0 and 1 indicate fire buttons E771 RTS ;and return ************************************************************************** ************************************************************************** ** ** ** OSBYTE DEFAULT ENTRY POINT ** ** ** ** pointed to by default BYTEV ** ** ** ************************************************************************** ************************************************************************** E772 PHA ;save A E773 PHP ;save Processor flags E774 SEI ;disable interrupts E775 STA &EF ;store A,X,Y in zero page E777 STX &F0 ; E779 STY &F1 ; E77B LDX #&07 ;X=7 to signal osbyte is being attempted E77D CMP #&75 ;if A=0-116 E77F BCC &E7C2 ;then E7C2 E781 CMP #&A1 ;if A<161 E783 BCC &E78E ;then E78E E785 CMP #&A6 ;if A=161-165 E787 BCC &E7C8 ;then EC78 E789 CLC ;clear carry E78A LDA #&A1 ;A=&A1 E78C ADC #&00 ; ********* process osbyte calls 117 - 160 ***************************** E78E SEC ;set carry E78F SBC #&5F ;convert to &16 to &41 (22-65) E791 ASL ;double it (44-130) E792 SEC ;set carry E793 STY &F1 ;store Y E795 TAY ;Y=A E796 BIT &025E ;read econet intercept flag E799 BPL &E7A2 ;if no econet intercept required E7A2 E79B TXA ;else A=X E79C CLV ;V=0 E79D JSR &E57E ; to JMP via ECONET vector E7A0 BVS &E7BC ;if return with V set E7BC E7A2 LDA &E5B4,Y ;get address from table E7A5 STA &FB ;store it as hi byte E7A7 LDA &E5B3,Y ;repeat for lo byte E7AA STA &FA ; E7AC LDA &EF ;restore A E7AE LDY &F1 ;Y E7B0 BCS &E7B6 ;if carry is set E7B6 E7B2 LDY #&00 ;else E7B4 LDA (&F0),Y ;get value from address pointed to by &F0/1 (Y,X) E7B6 SEC ;set carry E7B7 LDX &F0 ;restore X E7B9 JSR &F058 ;call &FA/B E7BC ROR ;C=bit 0 E7BD PLP ;get back flags E7BE ROL ;bit 0=Carry E7BF PLA ;get back A E7C0 CLV ;clear V E7C1 RTS ;and exit *************** Process OSBYTE CALLS BELOW &75 ************************** E7C2 LDY #&00 ;Y=0 E7C4 CMP #&16 ;if A<&16 E7C6 BCC &E791 ;goto E791 E7C8 PHP ;push flags E7C9 PHP ;push flags E7CA PLA ;pull flags E7CB PLA ;pull flags E7CC JSR &F168 ;offer paged ROMs service 7/8 unrecognised osbyte/word E7CF BNE &E7D6 ;if roms don't recognise it then E7D6 E7D1 LDX &F0 ;else restore X E7D3 JMP &E7BC ;and exit E7D6 PLP ;else pull flags E7D7 PLA ;and A E7D8 BIT &D9B7 ;set V and C E7DB RTS ;and return E7DC LDA &EB ;read cassette critical flag bit 7 = busy E7DE BMI &E812 ;if busy then EB12 E7E0 LDA #&08 ;else A=8 to check current Catalogue status E7E2 AND &E2 ;by ANDing with CFS status flag E7E4 BNE &E7EA ;if not set (not in use) then E7EA RTS E7E6 LDA #&88 ;A=%10001000 E7E8 AND &BB ;AND with FS options (short msg bits) E7EA RTS ;RETURN ************************************************************************** ************************************************************************** ** ** ** OSWORD DEFAULT ENTRY POINT ** ** ** ** pointed to by default WORDV ** ** ** ************************************************************************** ************************************************************************** E7EB PHA ;Push A E7EC PHP ;Push flags E7ED SEI ;disable interrupts E7EE STA &EF ;store A,X,Y E7F0 STX &F0 ; E7F2 STY &F1 ; E7F4 LDX #&08 ;X=8 E7F6 CMP #&E0 ;if A=>224 E7F8 BCS &E78A ;then E78A with carry set E7FA CMP #&0E ;else if A=>14 E7FC BCS &E7C8 ;else E7C8 with carry set pass to ROMs & exit E7FE ADC #&44 ;add to form pointer to table E800 ASL ;double it E801 BCC &E793 ;goto E793 ALWAYS (carry clear E7F8) ;this reads bytes from table and enters routine ************************************************************************* * * * OSWORD 05 ENTRY POINT * * * * read a byte from I/O memory * * * ************************************************************************* ;block of 4 bytes set at address pointed to by 00F0/1 (Y,X) ;XY +0 ADDRESS of byte ; +4 on exit byte read E803 JSR &E815 ;set up address of data block E806 LDA (&F9,X) ;get byte E808 STA (&F0),Y ;store it E80A RTS ;exit ************************************************************************* * * * OSWORD 06 ENTRY POINT * * * * write a byte to I/O memory * * * ************************************************************************* ;block of 5 bytes set at address pointed to by 00F0/1 (Y,X) ;XY +0 ADDRESS of byte ; +4 byte to be written E80B JSR &E815 ;set up address E80E LDA (&F0),Y ;get byte E810 STA (&F9,X) ;store it E812 LDA #&00 ;a=0 E814 RTS ;exit ******************** set up address ********************************* E815 STA &FA ;&FA=A E817 INY ;Y=1 E818 LDA (&F0),Y ;get byte from block E81A STA &FB ;store it E81C LDY #&04 ;Y=4 E81E LDX #&01 ;X=1 E820 RTS ;and exit ************************************************************************* * * * OSBYTE 00 ENTRY POINT * * * * read OS version number * * * ************************************************************************* E821 BNE &E81E ;if A <> 0 then exit with X=OS, else generate error E823 BRK ; E824 DB &F7 ;error number E825 DB 'OS 1.20' ;error message E82C BRK