**************** BUFFER ADDRESS HI LOOK UP TABLE ************************ E435 DB &03 ; &300+&E0 => &3E0+32 => keyboard buffer E436 DB &0A ; &A00+&00 => &A00+256 => rs423 input E437 DB &08 ; &8C0+&40 => &900+192 => rs423 output E438 DB &07 ; &7C0+&C0 => &880+64 => printer E439 DB &07 ; &750+&F0 => &840+16 => sound 0 E43A DB &07 ; &760+&F0 => &850+16 => sound 1 E43B DB &07 ; &770+&F0 => &860+16 => sound 2 E43C DB &07 ; &780+&F0 => &870+16 => sound 3 E43D DB &09 ; &900+&C0 => &9C0+64 => speech **************** BUFFER ADDRESS LO LOOK UP TABLE ************************ E43E DB &00 E43F DB &00 E440 DB &C0 E441 DB &C0 E442 DB &50 E443 DB &60 E444 DB &70 E445 DB &80 E446 DB &00 **************** BUFFER START ADDRESS OFFSET **************************** E447 DB &E0 E448 DB &00 E449 DB &40 E44A DB &C0 E44B DB &F0 E44C DB &F0 E44D DB &F0 E44E DB &F0 E44F DB &C0 ******* get nominal buffer addresses in &FA/B ************************** ; ON ENTRY 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 ; ; The buffers are arranged so that an offset of &FF is the last entry, and ; incrementing to &00 passes the end of the buffer ; ON ENTRY X=buffer number E450 LDA &E43E,X ;get buffer base address lo E453 STA &FA ;store it E455 LDA &E435,X ;get buffer base address hi E458 STA &FB ;store it E45A RTS ;exit ************************************************************************* * * * OSBYTE 152 Examine Buffer status * * * ************************************************************************* ; On entry X = buffer number ; On exit FA/B points to buffer start ; CS = buffer empty ; Y = preserved ; A = corrupted ; CC = buffer not empty ; Y = offset to next character ; A = examined byte ; *BUG* default REMV code branches to the wrong exit point, omitting TAY ; so examined byte is lost to OSBYTE caller ; E45B BIT &D9B7 ;set V and E45E BVS &E461 ;jump to E461 ************************************************************************* * * * OSBYTE 145 Get byte from Buffer * * * ************************************************************************* ; On entry X = buffer number ; On exit FA/B points to buffer start ; CS = buffer empty ; Y = preserved ; A = corrupted ; CC = buffer not empty ; Y = offset to next character ; A = byte removed from buffer ; E460 CLV ;clear V E461 JMP (&022C) ;Jump via REMV ************************************************************************* * * * REMV buffer remove vector default entry point * * * ************************************************************************* ; On entry, X=buffer number, VS=examine buffer, VC=remove from buffer ; On exit, CS=buffer empty, CC=buffer not empty, A=byte from buffer ; if byte removed from buffer, Y also equals byte from buffer ; to pass to OSBYTE caller ; E464 PHP ;push flags E465 SEI ;bar interrupts E466 LDA &02D8,X ;get output pointer for buffer X E469 CMP &02E1,X ;compare to input pointer E46C BEQ &E4E0 ;if equal buffer is empty so jump to return with SEC E46E TAY ;else A=Y E46F JSR &E450 ;and get buffer pointer into FA/B E472 LDA (&FA),Y ;read byte from buffer E474 BVS &E491 ;if V was set on input, jump to return with CLC ; ;*BUG* Should be BVS LE490 to set Y=byte E476 PHA ;otherwise, update buffer pointer E477 INY ;increment Y E478 TYA ;A=Y E479 BNE &E47E ;pointer<>0, not reached end of buffer E47B LDA &E447,X ;get offset to start of buffer E47E STA &02D8,X ;set update buffer output pointer E481 CPX #&02 ;if buffer is input (0 or 1) E483 BCC &E48F ;then skip checking empty buffer E485 CMP &02E1,X ;compare output pointer with input pointer E488 BNE &E48F ;not the same, so not empty, so go to E48F E48A LDY #&00 ;buffer is empty E48C JSR &E494 ;send Event 0 for Buffer Empty event E48F PLA ;get back the byte from buffer E490 TAY ;put it in Y for OSBYTE caller E491 PLP ;restore IRQs E492 CLC ;clear carry to indicate success E493 RTS ;and exit ************************************************************************** ************************************************************************** ** ** ** CAUSE AN EVENT ** ** ** ************************************************************************** ************************************************************************** \on entry, \ Y=event number, passed in A to EVENTV \ X=parameter 1, passed in X to EVENTV \ A=parameter 2, passed in Y to EVENTV \on exit, \ carry clear=event enabled, A=preserved, X,Y returned \ carry set= event disabled, A,X,Y preserved E494 PHP ;push flags E495 SEI ;bar interrupts E496 PHA ;push A E497 STA &FA ;&FA=A E499 LDA &02BF,Y ;get enable event flag E49C BEQ &E4DF ;if 0 event is not enabled so exit with SEC E49E TYA ;else A=Y E49F LDY &FA ;Y=A E4A1 JSR &F0A5 ;vector through &220 E4A4 PLA ;get back A E4A5 PLP ;get back flags E4A6 CLC ;clear carry for success E4A7 RTS ;and exit ********* check event 2 character entering buffer *********************** E4A8 TYA ;A=Y E4A9 LDY #&02 ;Y=2 E4AB JSR &E494 ;check event E4AE TAY ;Y=A ************************************************************************* * * * OSBYTE 138 Put byte into Buffer * * * ************************************************************************* ;on entry X is buffer number, Y is character to be written E4AF TYA ;A=Y E4B0 JMP (&022A) ;jump to INSBV ************************************************************************* * * * INSBV insert character in buffer vector default entry point * * * ************************************************************************* ;on entry X is buffer number, A is character to be written E4B3 PHP ;save flags E4B4 SEI ;bar interrupts E4B5 PHA ;save A E4B6 LDY &02E1,X ;get buffer input pointer E4B9 INY ;increment Y E4BA BNE &E4BF ;if Y<>0 then hasn't wrapped past end E4BC LDY &E447,X ;get offset to buffer start E4BF TYA ;put it in A E4C0 CMP &02D8,X ;compare it with output pointer E4C3 BEQ &E4D4 ;if equal buffer is full so jump forwards E4C5 LDY &02E1,X ;get unupdated input pointer back E4C8 STA &02E1,X ;store updated input pointer E4CB JSR &E450 ;and point &FA/B to buffer base E4CE PLA ;get back byte E4CF STA (&FA),Y ;store it in buffer E4D1 PLP ;restore interupts E4D2 CLC ;clear carry for success E4D3 RTS ;and exit E4D4 PLA ;get back byte E4D5 CPX #&02 ;are we are working on an input buffer? E4D7 BCS &E4E0 ;if output buffer, skip buffer full event E4D9 LDY #&01 ;else Y=1 E4DB JSR &E494 ;send Event 1 - Input Buffer Full E4DE PHA ;push A to balance next PLA ***** return with carry set ********************************************* E4DF PLA ;restore A E4E0 PLP ;restore flags E4E1 SEC ;set carry E4E2 RTS ;and exit ***************** CODE MODIFIER ROUTINE ********************************* * CHECK FOR ALPHA CHARACTER * ************************************************************************* ;ENTRY character in A ;exit with carry set if non-Alpha character E4E3 PHA ;Save A E4E4 AND #&DF ;convert lower to upper case E4E6 CMP #&41 ;is it 'A' or greater? E4E8 BCC &E4EE ;if not exit routine with carry set E4EA CMP #&5B ;is it less than 'Z' E4EC BCC &E4EF ;if so exit with carry clear E4EE SEC ;else clear carry E4EF PLA ;get back original value of A E4F0 RTS ;and Return ******* INSERT byte in Keyboard buffer ********************************* E4F1 LDX #&00 ;X=0 to indicate keyboard buffer ************************************************************************* * * * OSBYTE 153 Put byte in input Buffer checking for ESCAPE * * * ************************************************************************* ;on entry X = buffer number (either 0 or 1) ;X=1 is RS423 input ;X=0 is Keyboard ;Y is character to be written E4F3 TXA ;A=buffer number E4F4 AND &0245 ;and with RS423 mode (0 treat as keyboard ;1 ignore Escapes no events no soft keys) E4F7 BNE &E4AF ;so if RS423 buffer AND RS423 in normal mode (1) E4AF E4F9 TYA ;else Y=A character to write E4FA EOR &026C ;compare with current escape ASCII code (0=match) E4FD ORA &0275 ;or with current ESCAPE status (0=ESC, 1=ASCII) E500 BNE &E4A8 ;if ASCII or no match E4A8 to enter byte in buffer E502 LDA &0258 ;else get ESCAPE/BREAK action byte E505 ROR ;Rotate to get ESCAPE bit into carry E506 TYA ;get character back in A E507 BCS &E513 ;and if escape disabled exit with carry clear E509 LDY #&06 ;else signal EVENT 6 Escape pressed E50B JSR &E494 ; E50E BCC &E513 ;if event handles ESCAPE then exit with carry clear E510 JSR &E674 ;else set ESCAPE flag E513 CLC ;clear carry E514 RTS ;and exit ******** get a byte from keyboard buffer and interpret as necessary ***** ;on entry A=cursor editing status ;1=return &87-&8B, ;2= use cursor keys as soft keys 11-15 ;this area not reached if cursor editing is normal E515 ROR ;get bit 1 into carry E516 PLA ;get keycode back into A E517 BCS &E592 ;if carry is set return keycode ;else cursor keys are 'soft' ; Translate soft keys &80-&FF E519 TYA ;A=Y get back original key code (&80-&FF) E51A PHA ;PUSH A E51B LSR ;get high nybble into lo E51C LSR ; E51D LSR ; E51E LSR ;A=8-&F E51F EOR #&04 ;and invert bit 2 ;&8 becomes &C ;&9 becomes &D ;&A becomes &E ;&B becomes &F ;&C becomes &8 ;&D becomes &9 ;&E becomes &A ;&F becomes &B E521 TAY ;Y=A = 8-F E522 LDA &0265,Y ;read 026D to 0274 code interpretation status ;0=ignore key, 1=expand as 'soft' key ;2-&FF add this to base for ASCII code ;note that provision is made for keypad operation ;as codes &C0-&FF cannot be generated from keyboard ;but are recognised by OS ; E525 CMP #&01 ;is it 01 E527 BEQ &E594 ;if so expand as 'soft' key via E594 E529 PLA ;else get back original byte E52A BCC &E539 ;if above CMP generated Carry then code 0 must have ;been returned so E539 to ignore E52C AND #&0F ;else add ASCII to BASE key number so clear hi nybble E52E CLC ;clear carry E52F ADC &0265,Y ;add ASCII base E532 CLC ;clear carry E533 RTS ;and exit ; *********** ERROR MADE IN USING EDIT FACILITY *************************** E534 JSR &E86F ;produce bell E537 PLA ;get back A, buffer number E538 TAX ;X=buffer number ********get byte from buffer ******************************************** E539 JSR &E460 ;get byte from buffer X E53C BCS &E593 ;if buffer empty E593 to exit E53E PHA ;else Push byte E53F CPX #&01 ;if not RS423 input buffer, skip past E541 BNE &E549 ; E543 JSR &E173 ; E546 LDX #&01 ;Restore X=1 (RS423 input buffer) E548 SEC ;set carry E549 PLA ;get back original byte E54A BCC &E551 ;if carry clear (not RS423 input), skip past E54C LDY &0245 ;check RS423 mode (0 treat as keyboard) E54F BNE &E592 ;if not 0 ignore escapes etc., return with byte E551 TAY ;Y=byte from input buffer E552 BPL &E592 ;if code is less that &80 it's simple so return with it E554 AND #&0F ;else clear high nybble E556 CMP #&0B ;if less than 11 then treat as top-bit keypress E558 BCC &E519 ;function key or special keys E55A ADC #&7B ;else add &7C (&7B +C) to convert codes &xB-&xF to &87-&8B E55C PHA ;Push A E55D LDA &027D ;get cursor editing status E560 BNE &E515 ;not cursor editing, treat as top-bit keypress E562 LDA &027C ;else get character destination status ;Bit 0 enables RS423 driver ;Bit 1 disables VDU driver ;Bit 2 disables printer driver ;Bit 3 enables printer independent of CTRL B or CTRL C ;Bit 4 disables spooled output ;Bit 5 not used ;Bit 6 disables printer driver unless VDU 1 precedes character ;Bit 7 not used E565 ROR ;get bit 1 into carry E566 ROR ; E567 PLA ; E568 BCS &E539 ;if carry is set, VDU disabled, loop back for another keypress E56A CMP #&87 ;else is it COPY key E56C BEQ &E5A6 ;jump with COPY key E56E TAY ;else Y=A E56F TXA ;A=X E570 PHA ;Push X E571 TYA ;get back Y E572 JSR &D8CE ;move edit cursor E575 PLA ;restore X E576 TAX ;and drop through to loop back for another keypress E577 BIT &025F ;check econet RDCH flag E57A BPL &E581 ;if not set goto E581 E57C LDA #&06 ;else Econet function 6 E57E JMP (&0224) ;Jump to NETV, Econet vector ********* get byte from key string ************************************** ;on entry 0268 contains key length ;and 02C9 key string pointer to next byte E581 LDA &0268 ;get length of keystring E584 BEQ &E539 ;if 0 E539 get a character from the buffer E586 LDY &02C9 ;get soft key expansion pointer E589 LDA &0B01,Y ;get character from string E58C INC &02C9 ;increment pointer E58F DEC &0268 ;decrement length ************** exit with carry clear ************************************ E592 CLC ; E593 RTS ;exit ; *** expand soft key strings ********************************************* Y=pointer to sring number E594 PLA ;restore original code E595 AND #&0F ;blank high nybble to get function key number E597 TAY ;Y=A E598 JSR &E3A8 ;get string length in A E59B STA &0268 ;and store it E59E LDA &0B00,Y ;get start point E5A1 STA &02C9 ;and store it E5A4 BNE &E577 ;if not 0 then get byte via E577 and exit *********** deal with COPY key ****************************************** E5A6 TXA ;A=X E5A7 PHA ;Push A E5A8 JSR &D905 ;read a character from the screen E5AB TAY ;Y=A E5AC BEQ &E534 ;if not valid A=0 so BEEP E5AE PLA ;else restore X E5AF TAX ; E5B0 TYA ;and Y E5B1 CLC ;clear carry E5B2 RTS ;and exit