D8B8 ADC &D6 ;add A/&DA to &D6/7 D8BA STA &D6 ; D8BC LDA &DA ; D8BE ADC &D7 ; D8C0 BPL &D8C6 ;if result +ve D8C6 D8C2 SEC ;else set carry D8C3 SBC &0354 ;and subtract screen memory size making it wrap round D8C6 STA &D7 ;store it in &D7 D8C8 LDY &031A ;get line in graphics cell containing current graphics D8CB LDA #&00 ;point A=0 D8CD RTS ;And exit ; D8CE PHA ;Push A D8CF LDA #&A0 ;A=&A0 D8D1 LDX &026A ;X=number of items in VDU queque D8D4 BNE &D916 ;if not 0 D916 D8D6 BIT &D0 ;else check VDU status byte D8D8 BNE &D916 ;if either VDU is disabled or plot to graphics ;cursor enabled then D916 D8DA BVS &D8F5 ;if cursor editing enabled D8F5 D8DC LDA &035F ;else get 6845 register start setting D8DF AND #&9F ;clear bits 5 and 6 D8E1 ORA #&40 ;set bit 6 to modify last cursor size setting D8E3 JSR &C954 ;change write cursor format D8E6 LDX #&18 ;X=&18 D8E8 LDY #&64 ;Y=&64 D8EA JSR &D482 ;set text input cursor from text output cursor D8ED JSR &CD7A ;modify character at cursor poistion D8F0 LDA #&02 ;A=2 D8F2 JSR &C59D ;bit 1 of VDU status is set to bar scrolling D8F5 LDA #&BF ;A=&BF D8F7 JSR &C5A8 ;bit 6 of VDU status =0 D8FA PLA ;Pull A D8FB AND #&7F ;clear hi bit (7) D8FD JSR &C4C0 ;entire VDU routine !! D900 LDA #&40 ;A=&40 D902 JMP &C59D ;exit D905 LDA #&20 ;A=&20 D907 BIT &D0 ;if bit 6 cursor editing is set D909 BVC &D8CB ; D90B BNE &D8CB ;or bit 5 is set exit &D8CB D90D JSR &D7C2 ;read a character from the screen D910 BEQ &D917 ;if A=0 on return exit via D917 D912 PHA ;else store A D913 JSR &C664 ;perform cursor right D916 PLA ;restore A D917 RTS ;and exit ; D918 LDA #&BD ;zero bits 2 and 6 of VDU status D91A JSR &C5A8 ; D91D JSR &C951 ;set normal cursor D920 LDA #&0D ;A=&0D D922 RTS ;and return ;this is response of CR as end of edit line ************************************************************************* * * * OSBYTE 132 - READ BOTTOM OF DISPLAY RAM * * * ************************************************************************* ; D923 LDX &0355 ;get current screen mode ************************************************************************* * * * OSBYTE 133 - READ LOWEST ADDRESS FOR GIVEN MODE * * * ************************************************************************* D926 TXA ;A=X D927 AND #&07 ;MOD 8 D929 TAY ;Y=A D92A LDX &C440,Y ;X=get RAM size key D92D LDA &C45E,X ;A=high byte of start address D930 LDX #&00 ;X=0 D932 BIT &028E ;get available RAM D935 BMI &D93E ;if bit 7 set then 32k so D93E D937 AND #&3F ;AND A with &3F D939 CPY #&04 ;if Y<4 D93B BCS &D93E ;then D93E D93D TXA ;else A=0 to return null value D93E TAY ;Y=A D93F RTS ;and return ************************************************************************* * * * DEFAULT VECTOR TABLE * * * ************************************************************************* D940 DB 10,E3 ;&E310 = USERV &200 D942 DB 54,DC ;&DC54 = BRKV &202 D944 DB 93,DC ;&DC93 = IRQ1V &204 D946 DB 89,DE ;&DE89 = IRQ2V &206 D948 DB 89,DF ;&DF89 = CLIV &208 D94A DB 72,E7 ;&E772 = BYTEV &20A D94C DB EB,E7 ;&E7EB = WORDV &20C D94E DB A4,E0 ;&E0A4 = WRCHV &20E D950 DB C5,DE ;&DEC5 = RDCHV &210 D952 DB 7D,F2 ;&F27D = FILEV &212 D954 DB 8E,F1 ;&F18E = ARGSV &214 D956 DB C9,F4 ;&F4C9 = BGETV &216 D958 DB 29,F5 ;&F529 = BPUTV &218 D95A DB A6,FF ;&FFA6 = GBPBV &21A D95C DB CA,F3 ;&F3CA = FINDV &21C D95E DB B1,F1 ;&F1B1 = FSCV &21E D960 DB A6,FF ;&FFA6 = EVNTV &220 D962 DB A6,FF ;&FFA6 = UPTV &222 D964 DB A6,FF ;&FFA6 = NETV &224 D966 DB A6,FF ;&FFA6 = VDUV &226 D968 DB 02,EF ;&EF02 = KEYV &228 D96A DB B3,E4 ;&E4B3 = INSBV &22A D96C DB 64,E4 ;&E464 = REMVB &22C D96E DB D1,E1 ;&E1D1 = CNPV &22E D970 DB A6,FF ;&FFA6 = IND1V &230 D972 DB A6,FF ;&FFA6 = IND2V &232 D974 DB A6,FF ;&FFA6 = IND3V &234 ************************************************************************* * * * MOS VARIABLES DEFAULT SETTINGS * * * ************************************************************************* *read/written by Osbytes &A6 to &FC *addresses &236 to &28C = address -&D740 D976 DB 90,01 ;Mos variables address (address to Add to osbyte ;number) in lo hi format (&190) &236 D978 DB 9F,0D ;Rom pointer address for indirecting into ROMS ;=09DF (lo hi format) &238 D97A DB A1,02 ;ROM information table address (&2A1) &23A D97C DB 2B,F0 ;Key translation table address (&F02B) &23C D97E DB 00,03 ;VDU variables start 0300 &23E D980 DB 00 ;CFS/Vertical sync Timeout counter &240 D981 DB 00 ;current input buffer number &241 D982 DB FF ;keyboard interrupt processing flag &242 D983 DB 00 ;primary OSHWM (default page) &243 D984 DB 00 ;current OSHWM (PAGE) &244 D985 DB 01 ;RS423 Mode &245 D986 DB 00 ;character defininition explosion switch &246 D987 DB 00 ;Filing system flag ROM=2 CFS=0 &247 D988 DB 00 ;current Video ULA control register &248 D989 DB 00 ;current pallette setting &249 D98A DB 00 ;number of ROM enabled at last BRK &24A D98B DB FF ;number of BASIC ROM &24B D98C DB 04 ;current ADC channel number &24C D98D DB 04 ;maximum ADC channel number &24D D98E DB 00 ;ADC conversion type 0 or 0C=12 bit 8=8 Bit &24E D98F DB FF ;RS423 busy flag (bit 7 = 0 =busy) &24F D990 DB 56 ;current ACIA control register setting &250 D991 DB 19 ;flash counter &251 D992 DB 19 ;mark period count &252 D993 DB 19 ;space period count &253 D994 DB 32 ;keyboard Auto-repeat delay &254 D995 DB 08 ;keyboard Auto-repeat rate &255 D996 DB 00 ;*EXEC file handle (0 = not open) &256 D997 DB 00 ;*SPOOL file handle (0 = not open) &257 D998 DB 00 ;bit 0 Escape enable/disable &258 ;bit 1 BREAK normal/clear memory D999 DB 00 ;Econet disable keyboard flag &259 D99A DB 20 ;keyboard status bit 3=1 shift pressed &25A bit 4=0 caps lock bit 5=0 shift lock bit 6=1 control bit bit 7=1 shift enabled D99B DB 09 ;buffer space left at buffer full signal &25B D99C DB 00 ;RS423 input suppression flag &25C D99D DB 00 ;cassette/RS423 flag (0=CFS, &40=RS423) &25D D99E DB 00 ;Econet OS call interception flag (bit 7) &25E D99F DB 00 ;Econet OSRDCH interception flag (bit 7) &25F D9A0 DB 00 ;Econet OSWRCH interception flag (bit 7) &260 D9A1 DB 50 ;speech enable/disable flac (50/20) &261 D9A2 DB 00 ;sound output enable flag &262 D9A3 DB 03 ;BELL channel number &263 D9A4 DB 90 ;BELL amplitude/Envelope number &264 D9A5 DB 64 ;BELL frequency &265 D9A6 DB 06 ;BELL duration &266 D9A7 DB 81 ;bit 7=1 ignore start up message &267 ;bit 0=1 ignore RFS !BOOT error D9A8 DB 00 ;length of KEY string &268 D9A9 DB 00 ;PRINT line counter &269 D9AA DB 00 ;number of items in VDU queque (2s complement &26A ;of number required) D9AB DB 09 ;TAB key value &26B D9AC DB 1B ;ESCAPE Character &26C ;The following are input buffer code interpretation bytes for ;keys returning the following keys C0-FF are available via ;keypads only! ;0=ignore key ;1=expand as normal key ;2-FF add to base for ASCII code D9AD DB 01 ;C0-CF &26D D9AE DB D0 ;D0-DF &26E D9AF DB E0 ;E0-EF &26F D9B0 DB F0 ;F0-FF &270 D9B1 DB 01 ;80-8F &271 D9B2 DB 80 ;90-9F &272 D9B3 DB 90 ;A0-AF &273 D9B4 DB 00 ;B0-BF &274 D9B5 DB 00 ;ESCAPE key status (0=ESC, 1,=ASCII) &275 D9B6 DB 00 ;ESCAPE action &276 D9B7 DB FF ;USER 6522 Bit IRQ mask &277 D9B8 DB FF ;6850 ACIA Bit IRQ bit mask &278 D9B9 DB FF ;System 6522 IRQ bit mask &279 D9BA DB 00 ;Tube prescence flag &27A D9BB DB 00 ;speech processor prescence flag &27B D9BC DB 00 ;character destination status &27C D9BD DB 00 ;cursor editing status &27D ****************** Warm reset high water mark *************************** D9BE DB 00 ;unused &27E D9BF DB 00 ;unused &27F D9C0 DB 00 ;country code &280 D9C1 DB 00 ;user flag &281 D9C2 DB 64 ;serial ULA control register setting &282 D9C3 DB 05 ;current system clock store pointer &283 D9C4 DB FF ;soft key status (unstable) &284 D9C5 DB 01 ;printer destination &285 D9C6 DB 0A ;printer ignore character &286 ********* COLD RESET High water mark ************************************** D9C7 DB 00 ;user BREAK routine address JMP &288 D9C8 DB 00 ;user BREAK routine address lo &288 D9C9 DB 00 ;user BREAK routine address hi &289 D9CA DB 00 ;unused &28A D9CB DB 00 ;unused &28B D9CC DB FF ;current language rom no. &28C *********** POWER-UP RESET High Water mark ******************************** ;later flags dealt with in routines ************************************************************************** ************************************************************************** ** ** ** ** ** RESET (BREAK) ENTRY POINT ** ** ** ** Power up Enter with nothing set, 6522 System VIA IER bits ** ** 0 to 6 will be clear ** ** ** ** BREAK IER bits 0 to 6 one or more will be set 6522 IER ** ** not reset by BREAK ** ** ** ************************************************************************** ************************************************************************** D9CD LDA #&40 ;set NMI first instruction to RTI D9CF STA &0D00 ;NMI ram start D9D2 SEI ;disable interrupts just in case D9D3 CLD ;clear decimal flag D9D4 LDX #&FF ;reset stack to where it should be D9D6 TXS ;(&1FF) D9D7 LDA &FE4E ;read interupt enable register of the system VIA D9DA ASL ;shift bit 7 into carry D9DB PHA ;save what's left D9DC BEQ &D9E7 ;if Power up A=0 so D9E7 D9DE LDA &0258 ;else if BREAK pressed read BREAK Action flags (set by ;*FX200,n) D9E1 LSR ;divide by 2 D9E2 CMP #&01 ;if (bit 1 not set by *FX200) D9E4 BNE &DA03 ;then &DA03 D9E6 LSR ;divide A by 2 again (A=0 if *FX200,2/3 else A=n/4 ********** clear store routine ****************************************** D9E7 LDX #&04 ;get page to start clearance from (4) D9E9 STX &01 ;store it in ZP 01 D9EB STA &00 ;store A at 00 D9ED TAY ;and in Y to set loop counter D9EE STA (&00),Y ;clear store D9F0 CMP &01 ;until address &01 =0 D9F2 BEQ &D9FD ; D9F4 INY ;increment pointer D9F5 BNE &D9EE ;if not zero loop round again D9F7 INY ;else increment again (Y=1) this avoids overwriting ;RTI instruction at &D00 D9F8 INX ;increment X D9F9 INC &01 ;increment &01 D9FB BPL &D9EE ;loop until A=&80 then exit ;note that RAM addressing for 16k loops around so ;&4000=&00 hence checking &01 for 00. This avoids ;overwriting zero page on BREAK D9FD STX &028E ;writes marker for available RAM 40 =16k,80=32 DA00 STX &0284 ;write soft key consistency flag **+********** set up system VIA ***************************************** DA03 LDX #&0F ;set PORT B to output on bits 0-3 Input 4-7 DA05 STX &FE42 ; ************************************************************************* * * * set addressable latch IC 32 for peripherals via PORT B * * * * ;bit 3 set sets addressed latch high adds 8 to VIA address * * ;bit 3 reset sets addressed latch low * * * * Peripheral VIA bit 3=0 VIA bit 3=1 * * * * Sound chip Enabled Disabled * * speech chip (RS) Low High * * speech chip (WS) Low High * * Keyboard Auto Scan Disabled Enabled * * C0 address modifier Low High * * C1 address modifier Low High * * Caps lock LED ON OFF * * Shift lock LED ON OFF * * * * C0 & C1 are involved with hardware scroll screen address * ************************************************************************* ;X=&F on entry DA08 DEX ;loop start DA09 STX &FE40 ;write latch IC32 DA0C CPX #&09 ;is it 9 DA0E BCS &DA08 ;if so go back and do it again ;X=8 at this point ;Caps lock On, SHIFT lock undetermined ;Keyboard Autoscan on ;sound disabled (may still sound) DA10 INX ;X=9 DA11 TXA ;A=X DA12 JSR &F02A ;interrogate keyboard DA15 CPX #&80 ;for keyboard links 9-2 and CTRL key (1) DA17 ROR &FC ;rotate MSB into bit 7 of &FC DA19 TAX ;get back value of X for loop DA1A DEX ;decrement it DA1B BNE &DA11 ;and if >0 do loop again ; on exit if Carry set link 3 made ;link 2 = bit 0 of &FC and so on ;if CTRL pressed bit 7 of &FC=1 ;X=0 DA1D STX &028D ;clear last BREAK flag DA20 ROL &FC ;CTRL is now in carry &FC is keyboard links DA22 JSR &EEEB ;set LEDs carry on entry bit 7 of A on exit DA25 ROR ;get carry back into carry flag ****** set up page 2 **************************************************** DA26 LDX #&9C ; DA28 LDY #&8D ; DA2A PLA ;get back A from &D9DB DA2B BEQ &DA36 ;if A=0 power up reset so DA36 with X=&9C Y=&8D DA2D LDY #&7E ;else Y=&7E DA2F BCC &DA42 ;and if not CTRL-BREAK DA42 WARM RESET DA31 LDY #&87 ;else Y=&87 COLD RESET DA33 INC &028D ;&28D=1 DA36 INC &028D ;&28D=&28D+1 DA39 LDA &FC ;get keyboard links set DA3B EOR #&FF ;invert DA3D STA &028F ;and store at &28F DA40 LDX #&90 ;X=&90 **********: set up page 2 ************************************************* ;on entry &28D=0 Warm reset, X=&9C, Y=&7E ;&28D=1 Power up , X=&90, Y=&8D ;&28D=2 Cold reset, X=&9C, Y=&87 DA42 LDA #&00 ;A=0 DA44 CPX #&CE ;zero &200+X to &2CD DA46 BCC &DA4A ; DA48 LDA #&FF ;then set &2CE to &2FF to &FF DA4A STA &0200,X ; DA4D INX ; DA4E BNE &DA44 ; ;A=&FF X=0 DA50 STA &FE63 ;set port A of user via to all outputs (printer out)