; MOS for BBC BASIC on Acorn Atom ; ; J.G Harston code ; modified to assemble online using asm80.com ; and functions given more informative names. ; ASCII_ACK equ 6 ASCII_BEL equ 7 ASCII_LF equ $0A ASCII_CR equ $0D ASCII_NAK equ $15 ASCII_ESC equ $1B ASCII_SP equ $20 ASCII_0 equ $30 ATOM_SP equ $40 ; I/O Addresses if 1; Atom: lowest_memory equ $0800 highest_memory equ $4000 screen_RAM equ $4000 ATOM_PPI equ $7000 ATOM_VIA equ $7800 org $F000 endif if 0 ; W65C02SXB ; ; This board has no 8255 PPI ; and you won't find one that runs at 14 MHz ; but since the port directions are fixed for Atom use ; you could simply use TTL chips. ; If you don't need to scan a keyboard, ; tape, or a 6847 then you could do without it altogether. ; ; ; ATOM_PPI equ $7000 ATOM_VIA equ $7fc0 endif ATOM_PPI_PORT_A equ ATOM_PPI+0 ; D7-4 to 6847, D3-0 to keyboard column decoder ATOM_PPI_PORT_B equ ATOM_PPI+1 ; D7-0 from keyboard rows ATOM_PPI_PORT_C equ ATOM_PPI+2 ; D7-0 inputs ATOM_PPI_CTRL equ ATOM_PPI+3 ATOM_VIA_IOBB equ ATOM_VIA+0 ATOM_VIA_IOA equ ATOM_VIA+1 ATOM_VIA_DDRB equ ATOM_VIA+2 ATOM_VIA_DDRA equ ATOM_VIA+3 ATOM_VIA_T1CL equ ATOM_VIA+4 ATOM_VIA_T1CH equ ATOM_VIA+5 ATOM_VIA_T1LL equ ATOM_VIA+6 ATOM_VIA_T1LH equ ATOM_VIA+7 ATOM_VIA_T2CL equ ATOM_VIA+8 ATOM_VIA_T2CH equ ATOM_VIA+9 ATOM_VIA_SR equ ATOM_VIA+$a ATOM_VIA_ACR equ ATOM_VIA+$b ATOM_VIA_PCR equ ATOM_VIA+$c ATOM_VIA_IFR equ ATOM_VIA+$d ATOM_VIA_IER equ ATOM_VIA+$e ATOM_VIA_ORA_IRA equ ATOM_VIA+$f ; > BBCMOS1/SRC ; Source for Atom MOS interface for BBC BASIC ; Source recreation by J.G.Harston ; ; SYS "OS_GetEnv" TO A$ ; A$=A$+" " ; A$=MID$(A$,1+INSTR(A$," ",1+INSTR(A$," ",1+INSTR(A$," ")))) ;; A%=INSTR(A$+" "," ") ; outfile$=LEFT$(A$,A%-1) ; A$=MID$(A$,A%+1) ; IF outfile$="" ; outfile$="outfile" ;; A%=INSTR(A$+" "," ") ; version$=LEFT$(A$,A%-1) ; A$=MID$(A$,A%+1) ; IF version$="" ; version$="1" ;; A%=INSTR(A$+" "," ") ; bugfix$ =LEFT$(A$,A%-1) ; A$=MID$(A$,A%+1) ; IF bugfix$ ="" ; bugfix$ ="0" ;; IF outfile$="" ; ERROR 220,"Syntax ; B6502 -quit BBCMOS/src " ; END ;; ; PRINT "Assembling ; Atom BBC MOS version ";version$ ; PRINT "Bugfix level ; ";bugfix$ ; PRINT "Outfile ; ";outfile$ ; ON ERROR REPORT ; PRINT " at line ";ERL ; END ; ; ; Note ; There are many bugs in this code. ; There is overlap between BBC memory locations and Atom memory locations, ; eg ; $FE is BBC FAULT pointer and Atom NoPrint character ; Error messages all have wrong error number. ; Unsupported calls bomb out instead of returning cleanly. ; Some implemented calls don't return correct results. ; ; Memory Map ; ---------- ; $00-&8F - BBC BASIC zero page workspace ; IRQ_A_store equ $98 IRQ_X_store equ $99 ; $9A CLI_A_store equ $9B CLI_line_pointer equ $9C ; word ; $9E/F - pointer to control block or memory OSWRCH_A_store equ $9E OSWRCH_X_store equ $9f OSWRCH_Y_store equ $A0 pointer_control_block equ $9e pointer_to_memory equ $9e ; an alias pointer_YX equ $9f ; $A1 OSWORD_0_control_block equ $A2 OSWORD_0_text_address equ $A4 OSWORD_0_maximum_length equ $A6 OSWORD_0_lowest_character equ $A7 OSWORD_0_highest_character equ $A8 ; screen_map equ $B3 ; 0-4 start_of_screen equ $B4 ; ; $C9/A - OSCLI dispatch address ; ; $DD - Y store in OSCLI current_line equ $DE ; $DE/F - Address of start of current line ; $E0 - b7=VDU disabled ; $E1 vector_0xE2 equ $E2 ; $E4/5 - X/Y store in VDU code ; $E8/9 - inline text pointer inline_text_ptr equ $E8 ; $EA ; ; ESC_flag equ $FF ; ; $0300-4 - TIME ; $0305-E VDU queue ; $305 - $01 $11 $12 $13 $16 $17 $1F ; $306 - char colour mode log mode char x ; $307 - colour phy b1 y ; $308 - red b2 ; $309 - grn b3 ; $30A - blu b4 ; $30B - b5 ; $30C - b6 ; $30D - b7 ; $30E - b8 ; $030F PLOT_vector equ $0313 ; word ; $0315 VDU_queue_length equ $316 sound_duration equ $317 ; word sound_pitch equ $319 ; word ; $0319/A - SOUND pitch - copied to 6522 T2 at ATOM_VIA_T2CL on Timer1 ; $031B/C - INKEY delay ; $031D-F - b16-b39 of INKEY delay ; $0320-4 - now+delay for INKEY ; ; $032A - MODE ; ; $0400-&07FF - BBC BASIC workspace ; ; MOS entry addresses ; ------------------- ; OS_CLI equ $FFF7 ; OSBYTE equ $FFF4 ; OSWORD equ $FFF1 ; OSWRCH equ $FFEE ; OSWRCR equ $FFEC ; OSNEWL equ $FFE7 ; OSASCI equ $FFE3 ; OSRDCH equ $FFE0 ; Vectors ; ------- userv equ $200 brkv equ $202 irq1v equ $204 irq2v equ $206 cliv equ $208 bytev equ $20A wordv equ $20C wrchv equ $20E rdchv equ $210 filev equ $212 argsv equ $214 bgetv equ $216 bputv equ $218 gbpbv equ $21A findv equ $21C fscv equ $21E evntv equ $220 uptv equ $222 netv equ $224 vduv equ $226 keyv equ $228 insv equ $22A remv equ $22C cnpv equ $22E ind1v equ $230 ind2v equ $232 ind3v equ $234 ; BUGFIX%=VALbugfix$ ; DIM mcode% $1100 ; load% equ $F000 ; FOR opt%=4 TO 7 STEP 3 ; P%=load% ; O%=mcode% ; [OPT opt% ; ============== ; OSWORD HANDLER ; ============== ; On entry, A =function ; XY=>control block ; On exit, A,X,Y preserved if not OSWORD 0 ; control block updated ; OSWORD_handler: CMP #$00 BEQ OSWORD_0_READ_INPUT_LINE ; Jump with read input line CMP #$01 BEQ LF013 ; Jump with =TIME CMP #$02 BEQ OSWORD_2_TIME_set ; Jump with TIME= CMP #$07 BEQ LF016 ; Jump with SOUND if 1 ; OPT FNif(BUGFIX%<1) JMP LF0E6 ; Otherwise, generate error - BAD, should just return else RTS ; Unrecognised OSWORD, return endif ; LF013: JMP OSWORD_1_TIME ; Pass on to do =TIME LF016: JMP OSWORD_7_SOUND_chn_vol_pitch_dur ; Pass on to do SOUND ; OSWORD 0 - READ INPUT LINE ; ========================== ; Bugs ; If line length becomes: 127 chars, DEL/Ctrl-U mess up ; Escape is printed then checked for, it shouldn't be printed OSWORD_0_READ_INPUT_LINE: STX OSWORD_0_control_block STY $A3 LDY #4 loop_F01F: LDA (OSWORD_0_control_block),Y STA $00A4,Y ; Copy control block DEY BPL loop_F01F loop_F027: LDY #0 ; Line length=0 loop_F029: JSR OSRDCH ; Wait for character ; Should check for Escape CMP #ASCII_ESC BNE LF03E ; Not Ctrl-U loop_F030: DEY BMI loop_F027 ; Dec. length, restart if <0 ; *BUG* is line length>128, fails LDA #$7F JSR OSWRCH ; VDU 127 JMP loop_F030 ; Loop back until all done LF03B: JMP loop_F027 ; Nothing calls this LF03E: CMP #$7F BNE not_DELETE ; Not DELETE DEY BMI loop_F027 ; Dec. length, restart if <0 ; *BUG* is line length>128, fails JSR OSWRCH ; VDU 127 JMP loop_F029 ; Loop back for another character not_DELETE: JSR OSWRCH ; Print this character CMP #ASCII_CR BEQ ASCII_CR_pressed ; If , finish CMP #ASCII_ESC BEQ ASCII_ESC_pressed ; If , finish - shouldn't have printed this CMP OSWORD_0_lowest_character BCC loop_F029 ; If pressed ; ------------ ASCII_CR_pressed: STA (OSWORD_0_text_address),Y JSR OSNEWL ; Store and print newline LDX #0 ; X=$00 - Ok CLC ; CLC=ok RTS ; pressed ; ------------- ASCII_ESC_pressed: SEC ; SEC=Escape LDX #$FF ; X=$FF - Escape STX ESC_flag ; Also set ESCFLAG RTS OSWORD_2_TIME_set: STX pointer_control_block STY pointer_control_block+1 LDY #4 ; Copy 5 bytes of control block loop_F085: LDA (pointer_control_block),Y STA $0300,Y ; Copy to TIME at $0300-&0304 DEY BPL loop_F085 LDY pointer_control_block+1 RTS ; Restore Y and return OSWORD_1_TIME: STX pointer_control_block STY pointer_control_block+1 LDY #4 ; Copy 5 bytes of control block loop_F096: LDA $0300,Y STA (pointer_control_block),Y ; Copy from TIME at $0300-&0304 DEY BPL loop_F096 LDY pointer_control_block+1 RTS ; Restore Y and return OSWORD_7_SOUND_chn_vol_pitch_dur: STX pointer_control_block STY pointer_control_block+1 LDY #$04 ; Point to pitch LDA (pointer_control_block),Y STA sound_pitch ; $319/A=pitch INY LDA (pointer_control_block),Y STA sound_pitch+1 INY LDA (pointer_control_block),Y STA sound_duration ; $317/8=duration INY LDA (pointer_control_block),Y STA sound_duration+1 LDA sound_pitch STA ATOM_VIA_T2CL ; Store pitch.lo to 6522 T2.lo LDA sound_pitch+1 STA ATOM_VIA_T2CH ; Store pitch.hi to 6522 T2.hi LDA #$A0 STA ATOM_VIA_IER ; Enable 6522 T2 IRQs to toggle Speaker LDY pointer_control_block+1 RTS ; Restore Y and return ; ============== ; OSBYTE HANDLER ; ============== ; On entry, A =function ; XY=parameters ; On exit, A =preserved (memory calls may return a value) ; XY=return values ; Cy=may contain a return value LF0D2: OSBYTE_handler: CMP #$83 BEQ OSBYTE_0x83_Read_bottom_of_memory ; Jump with read bottom of memory CMP #$84 BEQ OSBYTE_0x84_Read_top_of_memory ; Jump with read top of memory CMP #$81 BEQ OSBYTE_0x81_INKEY ; Jump with INKEY CMP #$7E BEQ OSBYTE_0x7E_Escape_Acknowledge ; Jump with Escape Acknowledge CMP #$82 BEQ OSBYTE_0x82_Read_address_high_word ; Jump with address high word LF0E6: if 0 ; OPT FNif(BUGFIX%<1) BRK endif db 254 db "NOT IMPLEMENTED" db 0 if 0 ; *BUG* - should just return else RTS endif OSBYTE_0x82_Read_address_high_word: RTS ; Return XY unchanged OSBYTE_0x7E_Escape_Acknowledge: JMP loop_until_no_ESC OSBYTE_0x83_Read_bottom_of_memory: LDX #$00 LDY #$08 RTS ; Return $0800 OSBYTE_0x84_Read_top_of_memory: PHA LDA #lowest_memory STA pointer_to_memory+1 ; $9E/F=>&0800, lowest available location LDY #$00 scanning_loop: LDA (pointer_to_memory),Y EOR #$FF STA (pointer_to_memory),Y ; Complement byte in memory CMP (pointer_to_memory),Y BNE LF125 ; Doesn't match, end of RAM EOR #$FF STA (pointer_to_memory),Y ; Complement it back to restore it INY BNE scanning_loop ; Loop for 256 bytes INC pointer_to_memory+1 LDA pointer_to_memory+1 CMP #>highest_memory BCC scanning_loop ; Scan up to $4000 LF125: TYA TAX LDY pointer_to_memory+1 ; X=low byte, Y=high byte PLA RTS ; A.b7=1, indicates <&10000 OSBYTE_0x81_INKEY: STX $031B STY $031C ; Store INKEY countdown time LDX #0 STX $031F STX $031E STX $031D ; Set b16-b39 of INKEY delay to zero LF13C: LDY #$04 CLC ; Five bytes to add LF13F: LDA $0300,X ADC $031B,X STA $0320,X ; $320-4 = TIME+INKEY delay INX DEY BPL LF13F LF14C: JSR LFE4A BCC LF162 ; Test keyboard, jump if key pressed LDX #$04 ; Compare five bytes LF153: LDA $0320,X CMP $0300,X ; Compare TIME with INKEY timeout BMI LF16A ; Timed out, jump to exit BNE LF14C ; Not the same, loop back DEX BPL LF153 ; Loop to test all five bytes BMI LF16A ; All bytes same, timed out ; Key pressed ; ----------- LF162: JSR LF16E ; Convert keypress TAX ; X=keypress LDY #$00 ; Y = $00 - Ok CLC RTS ; CLC=Ok, and return LF16A: LDY #ESC_flag SEC RTS ; Y = $FF, SEC = Timed out LF16E: PHP JMP LFE8A ; Push flags, jump to convert keypress OSBYTE_0x7E_Escape_Acknowledge_: if 0 ; OPT FNif(BUGFIX%>0) LDX ESC_flag ; X=old Escape state endif loop_until_no_ESC: LDA ESC_flag BPL LF17C ; No pending Escape, exit JSR LF17D JMP loop_until_no_ESC ; Update Escape state, loop until no Escape LF17C: RTS ; **BUG** Should return previous Escape state in X ; Update Escape state by checking for Escape key pressed ; ------------------------------------------------------ LF17D: LDA ATOM_PPI_PORT_A PHA ; Get keyboard column AND #$F0 STA ATOM_PPI_PORT_A ; Select keyboard column 0 LDA ATOM_PPI_PORT_B AND #$20 BEQ LF191 ; Read keyboard row, jump if Escape pressed LDA #$00 BPL LF1A0 ; Set 'No Escape' ; Escape pressed LF191: LDA #$20 STA ATOM_VIA_IER ; Disable VIA T2 IRQs - stop toggling speaker LDA #$00 STA sound_duration STA sound_duration+1 ; Clear SOUND duration to cancel sound LDA #$FF ; Set 'Escape pending' LF1A0: STA ESC_flag ; Set Escape state PLA STA ATOM_PPI_PORT_A RTS ; Restore keyboard column ; 6522 INTERUPT ; ============= ATOM_VIA_INTERRUPT: AND #$40 BNE LF1C2 ; Jump if Timer1 interupt ; 6522 Timer2 Interupt ; -------------------- LDA ATOM_PPI_PORT_C EOR #$04 STA ATOM_PPI_PORT_C ; Toggle Speaker bit LDA sound_pitch STA ATOM_VIA_T2CL ; Copy SOUND pitch to T2 latches LDA sound_pitch+1 STA ATOM_VIA_T2CH ; LDA IRQ_A_store RTI ; Restore A and return ; 6522 Timer1 Interupt - 100Hz timer ; ---------------------------------- LF1C2: STX IRQ_X_store JSR LF17D ; Update Escape state LDA sound_duration ORA sound_duration+1 BEQ LF1E7 ; If SOUND duration is zero, jump to continue LDA sound_duration BNE LF1D7 DEC sound_duration+1 ; Decrement SOUND duration LF1D7: DEC sound_duration LDA sound_duration ORA sound_duration+1 BNE LF1E7 ; If SOUND duration not zero, jump to continue LDA #$20 STA ATOM_VIA_IER ; Disable 6522 T2 IRQs, stop toggling Speaker LF1E7: LDX #$00 ; Increment 5-byte TIME LF1E9: INC $0300,X INX CPX #$05 BEQ LF1F6 LDA $02FF,X BEQ LF1E9 LF1F6: LDX IRQ_X_store LDA ATOM_VIA_T1CL ; Reset 6522 T1.lo counter LDA IRQ_A_store RTI ; Restore A and return LF1FE: LDX #$03 ; F1FE= A2 03 ". LF200: LDA $030F,X ; F200= BD 0F 03 =.. STA screen_map,X ; F203= 95 B3 3 DEX ; F205= CA J BPL LF200 ; F206= 10 F8 x LDA $030E ; F208= AD 0E 03 -.. AND #$04 ; F20B= 29 04 ). BNE LF222 ; F20D= D0 13 P. LDX #$02 ; F20F= A2 02 ". LF211: CLC ; F211= 18 LDA $BB,X ; F212= B5 BB 5; ADC screen_map,X ; F214= 75 B3 u3 STA $BB,X ; F216= 95 BB ; LDA $BC,X ; F218= B5 BC 5< ADC start_of_screen,X ; F21A= 75 B4 u4 STA $BC,X ; F21C= 95 BC < DEX ; F21E= CA J DEX ; F21F= CA J BPL LF211 ; F220= 10 EF o LF222: LDX #$03 ; F222= A2 03 ". LF224: LDA $BB,X ; F224= B5 BB 5; STA $030F,X ; F226= 9D 0F 03 ... DEX ; F229= CA J BPL LF224 ; F22A= 10 F8 x LDA $030E ; F22C= AD 0E 03 -.. AND #$03 ; F22F= 29 03 ). BEQ LF23F ; F231= F0 0C p. STA $BF ; F233= 85 BF ? LDA $030E ; F235= AD 0E 03 -.. AND #$08 ; F238= 29 08 ). BEQ LF240 ; F23A= F0 04 p. JSR LF301 ; F23C= 20 01 F3 s LF23F: RTS ; F23F= 60 ` LF240: LDX #$02 ; F240= A2 02 ". LF242: SEC ; F242= 38 8 LDA $BB,X ; F243= B5 BB 5; SBC screen_map,X ; F245= F5 B3 u3 LDY screen_map,X ; F247= B4 B3 43 STY $BB,X ; F249= 94 BB ; STA screen_map,X ; F24B= 95 B3 3 LDY start_of_screen,X ; F24D= B4 B4 44 LDA $BC,X ; F24F= B5 BC 5< SBC start_of_screen,X ; F251= F5 B4 u4 STY $BC,X ; F253= 94 BC < STA start_of_screen,X ; F255= 95 B4 4 STA $B7,X ; F257= 95 B7 7 BPL LF268 ; F259= 10 0D LDA #$00 ; F25B= A9 00 ). SEC ; F25D= 38 8 SBC screen_map,X ; F25E= F5 B3 u3 STA screen_map,X ; F260= 95 B3 3 LDA #$00 ; F262= A9 00 ). SBC start_of_screen,X ; F264= F5 B4 u4 STA start_of_screen,X ; F266= 95 B4 4 LF268: DEX ; F268= CA J DEX ; F269= CA J BPL LF242 ; F26A= 10 D6 V LDA start_of_screen+1 ; F26C= A5 B5 %5 CMP screen_map ; F26E= C5 B3 E3 LDA $B6 ; F270= A5 B6 %6 SBC start_of_screen ; F272= E5 B4 e4 BCC LF2A5 ; F274= 90 2F / LDA #$00 ; F276= A9 00 ). SBC start_of_screen+1 ; F278= E5 B5 e5 STA $B8 ; F27A= 85 B8 8 LDA #$00 ; F27C= A9 00 ). SBC $B6 ; F27E= E5 B6 e6 SEC ; F280= 38 8 ROR A ; F281= 6A j STA $BA ; F282= 85 BA ROR $B8 ; F284= 66 B8 f8 LF286: JSR LF301 ; F286= 20 01 F3 s LDA $BD ; F289= A5 BD %= CMP $0311 ; F28B= CD 11 03 M.. BNE LF298 ; F28E= D0 08 P. LDA $BE ; F290= A5 BE %> CMP $0312 ; F292= CD 12 03 M.. BNE LF298 ; F295= D0 01 P. LF297: RTS ; F297= 60 ` LF298: JSR LF2DE ; F298= 20 DE F2 ^r LDA $BA ; F29B= A5 BA % BMI LF286 ; F29D= 30 E7 0g JSR LF2CD ; F29F= 20 CD F2 Mr JMP LF286 ; F2A2= 4C 86 F2 L.r LF2A5: LDA start_of_screen ; F2A5= A5 B4 %4 LSR A ; F2A7= 4A J STA $BA ; F2A8= 85 BA LDA screen_map ; F2AA= A5 B3 %3 ROR A ; F2AC= 6A j STA $B8 ; F2AD= 85 B8 8 LF2AF: JSR LF301 ; F2AF= 20 01 F3 s LDA $BB ; F2B2= A5 BB %; CMP $030F ; F2B4= CD 0F 03 M.. BNE LF2C0 ; F2B7= D0 07 P. LDA $BC ; F2B9= A5 BC %< CMP $0310 ; F2BB= CD 10 03 M.. BEQ LF297 ; F2BE= F0 D7 pW LF2C0: JSR LF2CD ; F2C0= 20 CD F2 Mr LDA $BA ; F2C3= A5 BA % BPL LF2AF ; F2C5= 10 E8 h JSR LF2DE ; F2C7= 20 DE F2 ^r JMP LF2AF ; F2CA= 4C AF F2 L/r LF2CD: SEC ; F2CD= 38 8 LDA $B8 ; F2CE= A5 B8 %8 SBC start_of_screen+1 ; F2D0= E5 B5 e5 STA $B8 ; F2D2= 85 B8 8 LDA $BA ; F2D4= A5 BA % SBC $B6 ; F2D6= E5 B6 e6 STA $BA ; F2D8= 85 BA LDX #$00 ; F2DA= A2 00 ". BEQ LF2ED ; F2DC= F0 0F p. LF2DE: CLC ; F2DE= 18 LDA $B8 ; F2DF= A5 B8 %8 ADC screen_map ; F2E1= 65 B3 e3 STA $B8 ; F2E3= 85 B8 8 LDA $BA ; F2E5= A5 BA % ADC start_of_screen ; F2E7= 65 B4 e4 STA $BA ; F2E9= 85 BA LDX #$02 ; F2EB= A2 02 ". LF2ED: LDA $B7,X ; F2ED= B5 B7 57 BPL LF2FA ; F2EF= 10 09 LDA $BB,X ; F2F1= B5 BB 5; BNE LF2F7 ; F2F3= D0 02 P. DEC $BC,X ; F2F5= D6 BC V< LF2F7: DEC $BB,X ; F2F7= D6 BB V; LF2F9: RTS ; F2F9= 60 ` LF2FA: INC $BB,X ; F2FA= F6 BB v; BNE LF2F9 ; F2FC= D0 FB P{ INC $BC,X ; F2FE= F6 BC v< RTS ; F300= 60 ` ; Call the plot subroutine for the current screen mode LF301: JMP (PLOT_vector) ; F301= 6C 13 03 l.. ; Set up screen mode ; ================== ; Note, VDU driver only supports MODE 7 ; LF304: LDY #$00 LDA #$07 AND screen_map STA screen_map ; Ensure MODE is 0-7 STA $032A LDA #$07 SEC SBC screen_map ; A=7-MODE BEQ LF34A ; Jump with MODE 7 CMP #$05 BMI LF31C ; Jump with LDA #$04 LF31C: LDX #$40 ; X = $40xx, start of screen memory STX start_of_screen+1 STY start_of_screen STA screen_map TAX LDA LF357-1,X ; Get address of screen memory for this screen map TAX ; X=end of screen memory TYA ; Y=0 LF32A: STA (start_of_screen),Y DEY ; Clear video memory BNE LF32A ; Loop for 256 bytes INC start_of_screen+1 ; Step to next 256 bytes CPX start_of_screen+1 BNE LF32A ; Loop to end of video memory ; Set up PLOT and 6847 ; -------------------- LF335: LDY screen_map ; Get MODE *BUG* in MODE 7 this is 7 LDA LF360,Y STA PLOT_vector+1 ; Set up PLOT vector LDA LF35B,Y STA PLOT_vector LDA LF365,Y STA ATOM_PPI_PORT_A ; Set screen geometry RTS ; Set up MODE 7 ; ------------- LF34A: LDA #ATOM_SP LF34C: STA screen_RAM,Y ; Store in 512-byte screen RAM STA screen_RAM+$100,Y DEY BNE LF34C ; Loop to clear memory BEQ LF335 ; Jump back to set VDU variables ; Address of end of screen memory ; ------------------------------- LF357: db $44 ; MODE 6 - screen_RAM-&4400 db $46 ; MODE 5 - screen_RAM-&4600 db $4C ; MODE 4 - screen_RAM-&4C00 db $58 ; MODE 3-0 - screen_RAM-&5800 ; PLOT vector table ; ----------------- LF35B: db LF36A ; DIV 256 db >LF3C3 ; DIV 256 db >LF3DC ; DIV 256 db >LF3F5 ; DIV 256 db >LF432 ; DIV 256 ; 6847 screen geometry settings ; ----------------------------- LF365: db $00 db $30 db $70 db $B0 db $F0 ; MODE 7 - select screen type 0 (text) ; ==================================== LF36A: LDA $BC ; F36A= A5 BC %< ORA $BE ; F36C= 05 BE > BNE LF3C2 ; F36E= D0 52 PR LDA $BB ; F370= A5 BB %; CMP #$40 ; F372= C9 40 I@ BCS LF3C2 ; F374= B0 4C 0L LSR A ; F376= 4A J STA $C0 ; F377= 85 C0 @ LDA #$2F ; F379= A9 2F )/ SEC ; F37B= 38 8 SBC $BD ; F37C= E5 BD e= CMP #$30 ; F37E= C9 30 I0 BCS LF3C2 ; F380= B0 40 0@ LDX #$FF ; F382= A2 FF ". SEC ; F384= 38 8 LF385: INX ; F385= E8 h SBC #$03 ; F386= E9 03 i. BCS LF385 ; F388= B0 FB 0{ ADC #$03 ; F38A= 69 03 i. STA $C2 ; F38C= 85 C2 B TXA ; F38E= 8A ASL A ; F38F= 0A ASL A ; F390= 0A ASL A ; F391= 0A ASL A ; F392= 0A ASL A ; F393= 0A ORA $C0 ; F394= 05 C0 @ STA $C0 ; F396= 85 C0 @ LDA #$40 ; F398= A9 40 )@ ADC #$00 ; F39A= 69 00 i. STA $C1 ; F39C= 85 C1 A LDA $BB ; F39E= A5 BB %; LSR A ; F3A0= 4A J LDA $C2 ; F3A1= A5 C2 %B ROL A ; F3A3= 2A * TAY ; F3A4= A8 ( LDA LF453,Y ; F3A5= B9 53 F4 9St LF3A8: LDY #$00 ; F3A8= A0 00 LDX $BF ; F3AA= A6 BF $? DEX ; F3AC= CA J BEQ LF3BE ; F3AD= F0 0F p. DEX ; F3AF= CA J BEQ LF3B9 ; F3B0= F0 07 p. EOR #$FF ; F3B2= 49 FF I. AND ($C0),Y ; F3B4= 31 C0 1@ STA ($C0),Y ; F3B6= 91 C0 @ RTS ; F3B8= 60 ` LF3B9: EOR ($C0),Y ; F3B9= 51 C0 Q@ STA ($C0),Y ; F3BB= 91 C0 @ RTS ; F3BD= 60 ` LF3BE: ORA ($C0),Y ; F3BE= 11 C0 @ STA ($C0),Y ; F3C0= 91 C0 @ LF3C2: RTS ; F3C2= 60 ` ; MODE 6 - select screen type 1 ; ============================= LF3C3: LDA $BC ; F3C3= A5 BC %< ORA $BE ; F3C5= 05 BE > BNE LF3C2 ; F3C7= D0 F9 Py LDA $BB ; F3C9= A5 BB %; BMI LF3C2 ; F3CB= 30 F5 0u LSR A ; F3CD= 4A J LSR A ; F3CE= 4A J LSR A ; F3CF= 4A J STA $C0 ; F3D0= 85 C0 @ LDA #$3F ; F3D2= A9 3F )? SEC ; F3D4= 38 8 SBC $BD ; F3D5= E5 BD e= CMP #$40 ; F3D7= C9 40 I@ BCC LF40D ; F3D9= 90 32 2 RTS ; F3DB= 60 ` ; MODE 5 - select screen type 2 ; ============================= LF3DC: LDA $BC ; F3DC= A5 BC %< ORA $BE ; F3DE= 05 BE > BNE LF3C2 ; F3E0= D0 E0 P` LDA $BB ; F3E2= A5 BB %; BMI LF3C2 ; F3E4= 30 DC 0\ LSR A ; F3E6= 4A J LSR A ; F3E7= 4A J LSR A ; F3E8= 4A J STA $C0 ; F3E9= 85 C0 @ LDA #$5F ; F3EB= A9 5F )_ SEC ; F3ED= 38 8 SBC $BD ; F3EE= E5 BD e= CMP #$60 ; F3F0= C9 60 I` BCC LF40D ; F3F2= 90 19 LF3F4: RTS ; F3F4= 60 ` ; MODE 4 - select screen type 3 ; ============================= LF3F5: LDA $BC ; F3F5= A5 BC %< ORA $BE ; F3F7= 05 BE > BNE LF3C2 ; F3F9= D0 C7 PG LDA $BB ; F3FB= A5 BB %; BMI LF3C2 ; F3FD= 30 C3 0C LSR A ; F3FF= 4A J LSR A ; F400= 4A J LSR A ; F401= 4A J STA $C0 ; F402= 85 C0 @ LDA #$BF ; F404= A9 BF )? SEC ; F406= 38 8 SBC $BD ; F407= E5 BD e= CMP #$C0 ; F409= C9 C0 I@ BCS LF3C2 ; F40B= B0 B5 05 LF40D: LDY #$00 ; F40D= A0 00 STY $C1 ; F40F= 84 C1 A LF411: ASL A ; F411= 0A ROL $C1 ; F412= 26 C1 $A ASL A ; F414= 0A ROL $C1 ; F415= 26 C1 $A ASL A ; F417= 0A ROL $C1 ; F418= 26 C1 $A ASL A ; F41A= 0A ROL $C1 ; F41B= 26 C1 $A ADC $C0 ; F41D= 65 C0 e@ STA $C0 ; F41F= 85 C0 @ LDA $C1 ; F421= A5 C1 %A ADC #$40 ; F423= 69 40 i@ STA $C1 ; F425= 85 C1 A LDA $BB ; F427= A5 BB %; AND #$07 ; F429= 29 07 ). TAY ; F42B= A8 ( LDA LF451,Y ; F42C= B9 51 F4 9Qt JMP LF3A8 ; F42F= 4C A8 F3 L(s ; MODE 0-3 - select screen type 4 ; =============================== LF432: LDA $BC ; F432= A5 BC %< ORA $BE ; F434= 05 BE > BNE LF3F4 ; F436= D0 BC P< LDA $BB ; F438= A5 BB %; LSR A ; F43A= 4A J LSR A ; F43B= 4A J LSR A ; F43C= 4A J STA $C0 ; F43D= 85 C0 @ LDA #$BF ; F43F= A9 BF )? SEC ; F441= 38 8 SBC $BD ; F442= E5 BD e= CMP #$C0 ; F444= C9 C0 I@ BCS LF3F4 ; F446= B0 AC 0, LDY #$00 ; F448= A0 00 STY $C1 ; F44A= 84 C1 A ASL A ; F44C= 0A ROL $C1 ; F44D= 26 C1 $A BPL LF411 ; F44F= 10 C0 @ ; Bitmap table ; ============ LF451: db $80 db $40 LF453: db $20 db $10 db $08 db $04 db $02 db $01 ; ONLY CALLED FROM UNREACHABLE CODE LF459: AND #$03 ; F459= 29 03 TAY ; F45B= A8 ( LDA LF49D,Y ; F45C= B9 9D F4 9.t STA $0315 ; F45F= 8D 15 03 ... LDA ATOM_PPI_PORT_A AND #$F0 ; F465= 29 F0 )p CMP #$70 ; F467= C9 70 Ip BNE LF477 ; F469= D0 0C P. LDA #$00 ; F46B= A9 00 ). TAY ; F46D= A8 ( LF46E: STA $4600,Y ; F46E= 99 00 46 ..F STA $4700,Y ; F471= 99 00 47 ..G DEY ; F474= 88 BNE LF46E ; F475= D0 F7 Pw LF477: LDA ATOM_PPI_PORT_A AND #$DF ; F47A= 29 DF )_ STA ATOM_PPI_PORT_A ROL A ; ROL A ; ROL A ; AND #$03 ; TAY ; LDA LF491,Y ; STA PLOT_vector ; LDA LF495,Y ; STA PLOT_vector+1 ; ; TODO BAD STUFF HAPPENS HERE !!! LF491: db LF4A1 ; DIV 256 db >LF4BF ; DIV 256 db >LF4D7 ; DIV 256 db >LF506 ; DIV 256 LF499: db $3F ; F499= 3F db $CF ; F49A= CF db $F3 ; F49B= F3 db $FC ; F49C= FC LF49D: db $00 ; F49D= 00 db $55 ; F49E= 55 db $AA ; F49E= AA db $FF ; F4A0= FF LF4A1: LDA $BC ; F4A1= A5 BC ORA $BE ; F4A3= 05 BE BNE LF4EE ; F4A5= D0 47 LDA $BB ; F4A7= A5 BB CMP #$40 ; F4A9= C9 40 BCS LF4EE ; F4AB= B0 41 LSR A ; F4AD= 4A LSR A ; F4AE= 4A STA $C0 ; F4AF= 85 C0 LDY #$00 ; F4B1= A0 00 STY $C1 ; F4B3= 84 C1 LDA #$3F ; F4B5= A9 3F SEC ; F4B7= 38 SBC $BD ; F4B8= E5 BD CMP #$40 ; F4BA= C9 40 I@ BCC LF524 ; F4BC= 90 66 f RTS ; F4BE= 60 ` LF4BF: LDA $BC ; F4BF= A5 BC %< ORA $BE ; F4C1= 05 BE > BNE LF4EE ; F4C3= D0 29 P) LDA $BB ; F4C5= A5 BB %; BMI LF4EE ; F4C7= 30 25 0% LSR A ; F4C9= 4A J LSR A ; F4CA= 4A J STA $C0 ; F4CB= 85 C0 @ LDA #$3F ; F4CD= A9 3F )? SEC ; F4CF= 38 8 SBC $BD ; F4D0= E5 BD e= CMP #$40 ; F4D2= C9 40 I@ BCC LF51D ; F4D4= 90 47 G RTS ; F4D6= 60 ` LF4D7: LDA $BC ; F4D7= A5 BC %< ORA $BE ; F4D9= 05 BE > BNE LF4EE ; F4DB= D0 11 P. LDA $BB ; F4DD= A5 BB %; BMI LF4EE ; F4DF= 30 0D 0. LSR A ; F4E1= 4A J LSR A ; F4E2= 4A J STA $C0 ; F4E3= 85 C0 @ LDA #$5F ; F4E5= A9 5F )_ SEC ; F4E7= 38 8 SBC $BD ; F4E8= E5 BD e= CMP #$60 ; F4EA= C9 60 I` BCC LF51D ; F4EC= 90 2F / LF4EE: RTS ; F4EE= 60 ` LF4EF: EOR #$FF ; F4EF= 49 FF I. EOR ($C0),Y ; F4F1= 51 C0 Q@ STA ($C0),Y ; F4F3= 91 C0 @ RTS ; F4F5= 60 ` LF4F6: TAX ; F4F6= AA * AND ($C0),Y ; F4F7= 31 C0 1@ STA ($C0),Y ; F4F9= 91 C0 @ TXA ; F4FB= 8A EOR #$FF ; F4FC= 49 FF I. AND $0315 ; F4FE= 2D 15 03 -.. ORA ($C0),Y ; F501= 11 C0 @ STA ($C0),Y ; F503= 91 C0 @ RTS ; F505= 60 ` LF506: LDA $BC ; F506= A5 BC %< ORA $BE ; F508= 05 BE > BNE LF4EE ; F50A= D0 E2 Pb LDA $BB ; F50C= A5 BB %; BMI LF4EE ; F50E= 30 DE 0^ LSR A ; F510= 4A J LSR A ; F511= 4A J STA $C0 ; F512= 85 C0 @ LDA #$BF ; F514= A9 BF )? SEC ; F516= 38 8 SBC $BD ; F517= E5 BD e= CMP #$C0 ; F519= C9 C0 I@ BCS LF4EE ; F51B= B0 D1 0Q LF51D: LDY #$00 ; F51D= A0 00 STY $C1 ; F51F= 84 C1 A ASL A ; F521= 0A ROL $C1 ; F522= 26 C1 $A LF524: ASL A ; F524= 0A ROL $C1 ; F525= 26 C1 $A ASL A ; F527= 0A ROL $C1 ; F528= 26 C1 $A ASL A ; F52A= 0A ROL $C1 ; F52B= 26 C1 $A ASL A ; F52D= 0A ROL $C1 ; F52E= 26 C1 $A ADC $C0 ; F530= 65 C0 e@ STA $C0 ; F532= 85 C0 @ LDA $C1 ; F534= A5 C1 %A ADC #$80 ; F536= 69 80 i. STA $C1 ; F538= 85 C1 A LDA $BB ; F53A= A5 BB %; AND #$03 ; F53C= 29 03 ). TAX ; F53E= AA * LDA LF499,X ; F53F= BD 99 F4 =.t LDX $BF ; F542= A6 BF $? DEX ; F544= CA J BEQ LF4F6 ; F545= F0 AF p/ DEX ; F547= CA J BEQ LF4EF ; F548= F0 A5 p% AND ($C0),Y ; F54A= 31 C0 1@ STA ($C0),Y ; F54C= 91 C0 @ RTS ; F54E= 60 ` ; ============== ; OSWRCH HANDLER ; ============== ; On entry, A=character to output ; On exit, A,X,Y preserved ; On the BBC flags also preserved ; OSWRCH_handler: STY OSWRCH_Y_store STX OSWRCH_X_store STA OSWRCH_A_store ; Save registers LDX VDU_queue_length BEQ LF57F ; Jump if VDU queue empty STA $0305,X DEX STX VDU_queue_length ; Store byte in VDU queue BNE LF578 ; Queue not empty, exit LDA $0305 ; Get VDU command CMP #$16 BEQ LF5D1 ; Jump with MODE CMP #$19 BEQ LF575 ; Jump with PLOT CMP #$1F BNE LF578 ; Exit if not TAB JMP VDU_31_x_y_TAB ; Jump with TAB LF575: JMP LF614 ; Jump onwards for PLOT LF578: LDY OSWRCH_Y_store LDX OSWRCH_X_store LDA OSWRCH_A_store ; Restore registers RTS ; and return ; VDU queue empty, must be character or first byte of command ; ----------------------------------------------------------- LF57F: CMP #$16 BNE LF58E ; Jump if not VDU 22, start of MODE ; One more byte needed ; -------------------- LF583: LDX #$01 STX VDU_queue_length ; One more byte needed STA $0305 JMP LF578 ; Save command, and exit LF58E: CMP #$19 BNE LF59D ; Jump if not VDU 25, start of PLOT LDX #$05 STX VDU_queue_length ; Five more bytes needed STA $0305 JMP LF578 ; Save command, and exit LF59D: CMP #$12 BEQ LF583 ; Jump if VDU 18, COLOUR, to collect one byte CMP #$1F BNE LF5B0 ; Jump if not VDU 31, TAB LDX #$02 STX VDU_queue_length ; Two more bytes needed STA $0305 JMP LF578 ; Save command, and exit LF5B0: CMP #$10 BNE LF5BD ; Jump if not VDU 16 - CLG LDA $032A STA $0306 JMP LF5D1 ; Continue into MODE ; All VDU command sequences checked for, must be single character ; --------------------------------------------------------------- LF5BD: LDY OSWRCH_Y_store LDX OSWRCH_X_store LDA OSWRCH_A_store ; Get registers back CMP #$61 BMI LF5CE ; Not a lower-case character CMP #$7B BPL LF5CE SEC SBC #$20 ; Force lower case to upper case LF5CE: JMP LFE2B ; Jump to Atom Kernel VDU code ; VDU 22,n - MODE ; =============== LF5D1: LDA $0306 STA screen_map ; Get MODE parameter, set current MODE JSR LF304 ; Set up VDU hardware LDA screen_map ; Get current MODE CMP #$07 BNE LF5ED ; Not MODE 7, move graphics cursor to 0,0 JSR LF578 ; Get original registers back LDA #$0C JSR OSWRCH ; Do CLS, overwriting register store JSR LF578 ; Get registers back from register store LDA #$07 RTS ; Restore A to 7 and return ; Do MOVE 0,0 to move graphics cursor to (0,0) ; -------------------------------------------- LF5ED: JSR LF578 ; Get original registers back PHA ; Save A LDA #$19 JSR OSWRCH ; PLOT LDA #$04 JSR OSWRCH ; PLOT 4 = MOVE LDA #$00 ; Do MOVE 0,0 JSR OSWRCH JSR OSWRCH ; Send X=0 JSR OSWRCH JSR OSWRCH ; Send Y=0 PLA RTS ; Restore A and return ; UNREACHABLE LDA $0306 ; F60B= AD 06 03 -.. JSR LF459 ; F60E= 20 59 F4 Yt JMP LF578 ; F611= 4C 78 F5 Lxu LF614: LDA $030A ; F614= AD 0A 03 -.. CMP #$40 ; F617= C9 40 I@ BCC LF61D ; F619= 90 02 SBC #$38 ; F61B= E9 38 i8 LF61D: AND #$1F ; F61D= 29 1F ). STA $030E ; F61F= 8D 0E 03 ... LDA #$00 ; F622= A9 00 ). STA $032B ; F624= 8D 2B 03 .+. LDA $0308 ; F627= AD 08 03 -.. BPL LF636 ; F62A= 10 0A LDX #$03 ; F62C= A2 03 ". JSR LF6FA ; F62E= 20 FA F6 zv LDA #$FF ; F631= A9 FF ). STA $032B ; F633= 8D 2B 03 .+. LF636: LDA #$00 ; F636= A9 00 ). STA $BB ; F638= 85 BB ; STA $BC ; F63A= 85 BC < LDA $0309 ; F63C= AD 09 03 -.. LF63F: SEC ; F63F= 38 8 SBC #$05 ; F640= E9 05 i. BCS LF649 ; F642= B0 05 0. DEC $0308 ; F644= CE 08 03 N.. BMI LF651 ; F647= 30 08 0. LF649: INC $BB ; F649= E6 BB f; BNE LF63F ; F64B= D0 F2 Pr INC $BC ; F64D= E6 BC f< BNE LF63F ; F64F= D0 EE Pn LF651: LDA ATOM_PPI_PORT_A ; F651= AD 00 70 -.p AND #$F0 ; F654= 29 F0 )p CMP #$F0 ; F656= C9 F0 Ip BEQ LF666 ; F658= F0 0C p. CMP #$20 ; F65A= C9 20 I BCS LF662 ; F65C= B0 04 0. LSR $BC ; F65E= 46 BC F< ROR $BB ; F660= 66 BB f; LF662: LSR $BC ; F662= 46 BC F< ROR $BB ; F664= 66 BB f; LF666: LDA $032B ; F666= AD 2B 03 -+. BPL LF670 ; F669= 10 05 LDX #$08 ; F66B= A2 08 ". JSR LF70C ; F66D= 20 0C F7 w LF670: LDA #$00 ; F670= A9 00 STA $032C ; F672= 8D 2C 03 LDA $0306 ; F675= AD 06 03 BPL LF684 ; F678= 10 0A LDX #$01 ; F67A= A2 01 JSR LF6FA ; F67C= 20 FA F6 LDA #$FF ; F67F= A9 FF STA $032C ; F681= 8D 2C 03 LF684: LDA ATOM_PPI_PORT_A ; F684= AD 00 70 -.p AND #$F0 ; F687= 29 F0 )p CMP #$10 ; F689= C9 10 I. BEQ LF695 ; F68B= F0 08 p. CMP #$30 ; F68D= C9 30 I0 BEQ LF695 ; F68F= F0 04 p. CMP #$50 ; F691= C9 50 IP BNE LF6AA ; F693= D0 15 P. LF695: LDA $0307 ; F695= AD 07 03 -.. STA $BD ; F698= 85 BD = LDA $0306 ; F69A= AD 06 03 -.. STA $BE ; F69D= 85 BE > LSR $BE ; F69F= 46 BE F> ROR $BD ; F6A1= 66 BD f= LSR $BE ; F6A3= 46 BE F> ROR $BD ; F6A5= 66 BD f= JMP LF6E2 ; F6A7= 4C E2 F6 Lbv LF6AA: LDA $0307 ; F6AA= AD 07 03 -.. ASL A ; F6AD= 0A STA $BD ; F6AE= 85 BD = LDA $0306 ; F6B0= AD 06 03 -.. ROL A ; F6B3= 2A * STA $BE ; F6B4= 85 BE > CLC ; F6B6= 18 LDA $BD ; F6B7= A5 BD ADC $0307 ; F6B9= 6D 07 03 STA $BD ; F6BC= 85 BD LDA $BE ; F6BE= A5 BE ADC $0306 ; F6C0= 6D 06 03 . STA $BE ; F6C3= 85 BE LSR $BE ; F6C5= 46 BE ROR $BD ; F6C7= 66 BD LSR $BE ; F6C9= 46 BE ROR $BD ; F6CB= 66 BD LSR $BE ; F6CD= 46 BE ROR $BD ; F6CF= 66 BD LSR $BE ; F6D1= 46 BE ROR $BD ; F6D3= 66 BD LDA ATOM_PPI_PORT_A ; F6D5= AD 00 70 -.p AND #$F0 ; F6D8= 29 F0 )p CMP #$A0 ; F6DA= C9 A0 I BCS LF6EA ; F6DC= B0 0C 0. CMP #$00 ; F6DE= C9 00 I. BNE LF6E6 ; F6E0= D0 04 P. LF6E2: LSR $BE ; F6E2= 46 BE F> ROR $BD ; F6E4= 66 BD f= LF6E6: LSR $BE ; F6E6= 46 BE F> ROR $BD ; F6E8= 66 BD f= LF6EA: LDA $032C ; F6EA= AD 2C 03 -,. BPL LF6F4 ; F6ED= 10 05 LDX #$0A ; F6EF= A2 0A ". JSR LF70C ; F6F1= 20 0C F7 w LF6F4: JSR LF1FE ; F6F4= 20 FE F1 ~q JMP LF578 ; F6F7= 4C 78 F5 Lxu LF6FA: SEC ; F6FA= 38 8 LDA #$00 ; F6FB= A9 00 ). SBC $0306,X ; F6FD= FD 06 03 }.. STA $0306,X ; F700= 9D 06 03 ... LDA #$00 ; F703= A9 00 ). SBC $0305,X ; F705= FD 05 03 }.. STA $0305,X ; F708= 9D 05 03 ... RTS ; F70B= 60 ` LF70C: SEC ; F70C= 38 8 LDA #$00 ; F70D= A9 00 ). SBC screen_map,X ; F70F= F5 B3 u3 STA screen_map,X ; F711= 95 B3 3 LDA #$00 ; F713= A9 00 ). SBC start_of_screen,X ; F715= F5 B4 u4 STA start_of_screen,X ; F717= 95 B4 4 RTS ; F719= 60 ` ; OSFILE HANDLER ; ============== OSFILE_handler: STA OSWRCH_A_store ; F71A= 85 9E STX OSWRCH_X_store ; F71C= 86 9F STY OSWRCH_Y_store ; F71E= 84 A0 LDX #$A9 ; F720= A2 A9 ") LDY #$03 ; F722= A0 03 LF724: LDA (pointer_YX),Y ; F724= B1 9F 1. STA $00A9,Y ; F726= 99 A9 00 .). DEY ; F729= 88 BPL LF724 ; F72A= 10 F8 x LDA OSWRCH_A_store ; F72C= A5 9E %. BEQ LF74A ; F72E= F0 1A p. LDA #$00 ; F730= A9 00 ). STA $AD ; F732= 85 AD - LDY #$06 ; F734= A0 06 LDA (pointer_YX),Y ; F736= B1 9F 1. BEQ LF740 ; F738= F0 06 p. JSR LF945 ; F73A= 20 45 F9 Ey JMP LF76E ; F73D= 4C 6E F7 Lnw LF740: LDA #$FF ; F740= A9 FF ). STA $AD ; F742= 85 AD - JSR LF945 ; F744= 20 45 F9 Ey JMP LF76E ; F747= 4C 6E F7 Lnw LF74A: LDY #$06 ; F74A= A0 06 LDA (pointer_YX),Y ; F74C= B1 9F 1. STA $AD ; F74E= 85 AD - INY ; F750= C8 H LDA (pointer_YX),Y ; F751= B1 9F 1. STA $AE ; F753= 85 AE LDY #$0A ; F755= A0 0A LDA (pointer_YX),Y ; F757= B1 9F 1. STA $AF ; F759= 85 AF / INY ; F75B= C8 H LDA (pointer_YX),Y ; F75C= B1 9F 1. STA $B0 ; F75E= 85 B0 0 LDY #$0E ; F760= A0 0E LDA (pointer_YX),Y ; F762= B1 9F 1. STA $B1 ; F764= 85 B1 1 INY ; F766= C8 H LDA (pointer_YX),Y ; F767= B1 9F 1. STA $B2 ; F769= 85 B2 2 JSR LFAB8 ; F76B= 20 B8 FA 8z LF76E: LDA $9E ; F76E= A5 9E %. LDX OSWRCH_X_store ; F770= A6 9F $. LDY OSWRCH_Y_store ; F772= A4 A0 $ RTS ; F774= 60 ` ; CLI HANDLER ; =========== CLI_handler: STA CLI_A_store STX CLI_line_pointer STY CLI_line_pointer+1 LDY #1 ; Point to second character ; *BUG* This means OSCLI "fred" parses "red" loop_until_CR: LDA (CLI_line_pointer),Y STA $00FF,Y ; Copy command line to $100+ INY CMP #ASCII_CR BNE loop_until_CR ; Loop until JSR LF8C3 ; Process command line LDY CLI_line_pointer+1 LDX CLI_line_pointer LDA CLI_A_store ; Restore X/Y/A (not needed) RTS ; VDU 31,x,y - TAB ; ================ VDU_31_x_y_TAB: LDX $0307 ; F791= AE 07 03 ... CPX #$20 ; F794= E0 20 ` BCS LF7B6 ; F796= B0 1E 0. LDA $0306 ; F798= AD 06 03 -.. CMP #$10 ; F79B= C9 10 I. BCS LF7B6 ; F79D= B0 17 0. LDY $E0 ; F79F= A4 E0 $` JSR cursor_off ; F7A1= 20 1D FD } STX $E0 ; F7A4= 86 E0 ` LSR $DF ; F7A6= 46 DF F_ ASL A ; F7A8= 0A ASL A ; F7A9= 0A ASL A ; F7AA= 0A ASL A ; F7AB= 0A ASL A ; F7AC= 0A STA current_line ; F7AD= 85 DE ^ ROL $DF ; F7AF= 26 DF $_ LDY $E0 ; F7B1= A4 E0 $` JSR cursor_off ; F7B3= 20 1D FD } LF7B6: JMP LF578 ; F7B6= 4C 78 F5 Lxu LF7B9: db " WORK +" Print_inline_text: PLA STA inline_text_ptr PLA STA inline_text_ptr+1 loop_F7C6: LDY #0 INC inline_text_ptr BNE LF7CE INC inline_text_ptr+1 ; Update address LF7CE: LDA (inline_text_ptr),Y BMI end_of_text ; bit 7=1, end of text JSR OSWRCH JMP loop_F7C6 ; Print character and loop for more end_of_text: JMP (inline_text_ptr) ; Jump back to code after text LF7DB: LDX #$D4 ; F7DB= A2 D4 "T JSR LF7E0 ; F7DD= 20 E0 F7 `w LF7E0: LDA $01,X ; F7E0= B5 01 5. JSR print_hex_byte ; F7E2= 20 F1 F7 qw INX ; F7E5= E8 h INX ; F7E6= E8 h LDA $FE,X ; F7E7= B5 FE 5~ JSR print_hex_byte ; F7E9= 20 F1 F7 qw print_ASCII_space: LDA #ASCII_SP JMP OSWRCH ; F7EE= 4C EE FF Ln. print_hex_byte: PHA ; save for later LSR A LSR A LSR A LSR A JSR print_hex_digit ; F7F6= 20 FA F7 zw PLA ; restore print_hex_digit: AND #$0F CMP #$A BCC hex_nibble_is_adjusted ADC #6 hex_nibble_is_adjusted: ADC #ASCII_0 JMP OSWRCH ; F804= 4C EE FF Ln. LF807: JSR LF863 ; F807= 20 63 F8 cx LDX #$00 ; F80A= A2 00 ". CMP #$22 ; F80C= C9 22 I" BEQ LF816 ; F80E= F0 06 p. INX ; F810= E8 h BNE LF82E ; F811= D0 1B P. LF813: JMP LFA53 ; F813= 4C 53 FA LSz LF816: INY ; F816= C8 H LDA $0100,Y ; F817= B9 00 01 9.. CMP #ASCII_CR ; F81A= C9 0D I. BEQ LF813 ; F81C= F0 F5 pu STA $0140,X ; F81E= 9D 40 01 .@. INX ; F821= E8 h CMP #$22 ; F822= C9 22 I" BNE LF816 ; F824= D0 F0 Pp INY ; F826= C8 H LDA $0100,Y ; F827= B9 00 01 9.. CMP #$22 ; F82A= C9 22 I" BEQ LF816 ; F82C= F0 E8 ph LF82E: LDA #$0D ; F82E= A9 0D ). STA $013F,X ; F830= 9D 3F 01 .?. LDA #$40 ; F833= A9 40 )@ STA $C9 ; F835= 85 C9 I LDA #$01 ; F837= A9 01 ). STA $CA ; F839= 85 CA J LDX #$C9 ; F83B= A2 C9 "I RTS ; F83D= 60 ` LF83E: LDY #$00 ; F83E= A0 00 LF840: LDA $00,X ; F840= B5 00 5. STA $00C9,Y ; F842= 99 C9 00 .I. INX ; F845= E8 h INY ; F846= C8 H CPY #$0A ; F847= C0 0A @. BCC LF840 ; F849= 90 F5 u LDY #$FF ; F84B= A0 FF LDA #$0D ; F84D= A9 0D ). LF84F: INY ; F84F= C8 H CPY #$0E ; F850= C0 0E @. BCS LF85B ; F852= B0 07 0. CMP ($C9),Y ; F854= D1 C9 QI BNE LF84F ; F856= D0 F7 Pw CPY #0 ; F858= C0 00 @. RTS LF85B: BRK db 254 db "NAME" BRK ; *BUG* Error number wrong, should be 221 loop_F862: INY ; F862= C8 H LF863: LDA $0100,Y ; F863= B9 00 01 9.. CMP #ASCII_SP BEQ loop_F862 ; F868= F0 F8 px RTS LF86B: CMP #ASCII_0 BCC SEC_and_RTS CMP #ASCII_0+10 BCC LF87B SBC #7 BCC SEC_and_RTS CMP #$40 BCS RTS_F87D LF87B: AND #$0F RTS_F87D: RTS SEC_and_RTS: SEC ; F87E= 38 8 RTS ; F87F= 60 ` LF880: LDA #0 ; F880= A9 00 ). STA $0,X ; F882= 95 00 STA $1,X ; F884= 95 01 STA $2,X ; F886= 95 02 JSR LF863 ; F888= 20 63 F8 cx LF88B: LDA $0100,Y ; F88B= B9 00 01 9.. JSR LF86B ; F88E= 20 6B F8 kx BCS LF8A8 ; F891= B0 15 0. ASL A ; F893= 0A ASL A ; F894= 0A ASL A ; F895= 0A ASL A ; F896= 0A STY $02,X ; F897= 94 02 LDY #$04 ; F899= A0 04 LF89B: ASL A ; F89B= 0A ROL $00,X ; F89C= 36 00 6. ROL $01,X ; F89E= 36 01 6. DEY ; F8A0= 88 BNE LF89B ; F8A1= D0 F8 Px LDY $02,X ; F8A3= B4 02 4. INY ; F8A5= C8 H BNE LF88B ; F8A6= D0 E3 Pc LF8A8: LDA $02,X ; F8A8= B5 02 5. RTS ; F8AA= 60 ` ; Command table ; ------------- LF8AB: db "CAT" db >STAR_CAT ; DIV 256 db LF932 ; DIV 256 db LFA91 ; DIV 256 db LF9F6 ; DIV 256 db LF8FA ; DIV 256 db () ; ===================== LF932: JSR LF807 ; F932= 20 07 F8 x LDX #$CB ; F935= A2 CB "K JSR LF880 ; F937= 20 80 F8 x BEQ LF940 ; F93A= F0 04 p. LDA #$FF ; F93C= A9 FF ). STA $CD ; F93E= 85 CD M LF940: JSR LFA4C ; F940= 20 4C FA Lz LDX #$C9 ; F943= A2 C9 "I LF945: PHP ; F945= 08 SEI ; F946= 78 x JSR LF83E ; F947= 20 3E F8 >x PHP ; F94A= 08 JSR LFC13 ; F94B= 20 13 FC | PLP ; F94E= 28 ( BEQ LF909 ; F94F= F0 B8 p8 LDA #$00 ; F951= A9 00 ). STA $D0 ; F953= 85 D0 P STA $D1 ; F955= 85 D1 Q LF957: JSR LF979 ; F957= 20 79 F9 yy BCC LF928 ; F95A= 90 CC L INC $D0 ; F95C= E6 D0 fP INC $CC ; F95E= E6 CC fL BNE LF957 ; F960= D0 F5 Pu CLC ; F962= 18 BCC LF928 ; F963= 90 C3 C LF965: JSR OSWRCH ; F965= 20 EE FF n. INY ; F968= C8 LF969: LDA $00ED,Y ; F969= B9 ED 00 9m. CMP #ASCII_CR ; F96C= C9 0D I. BNE LF965 ; F96E= D0 F5 Pu LF970: INY ; F970= C8 H JSR print_ASCII_space ; F971= 20 EC F7 lw CPY #$0E ; F974= C0 0E @. BCC LF970 ; F976= 90 F8 x RTS ; F978= 60 ` LF979: LDA #$00 ; F979= A9 00 ). STA $DC ; F97B= 85 DC \ JSR LFB61 ; F97D= 20 61 FB a{ BVC LF979+1 ; **BANG!** BNE LF979 ; F982= D0 F5 Pu JSR LFB9C ; F984= 20 9C FB { PHP ; F987= 08 JSR LFBB5 ; F988= 20 B5 FB 5{ PLP ; F98B= 28 ( BEQ LF99E ; F98C= F0 10 p. LDA $DB ; F98E= A5 DB %[ AND #$20 ; F990= 29 20 ) ORA $EA ; F992= 05 EA j BNE LF979 ; F994= D0 E3 Pc JSR LF969 ; F996= 20 69 F9 iy JSR OSNEWL ; F999= 20 E7 FF g. BNE LF979 ; F99C= D0 DB P[ LF99E: LDX #$02 ; F99E= A2 02 ". LDA $DD ; F9A0= A5 DD %] BMI LF9B7 ; F9A2= 30 13 0. LF9A4: LDA $CF,X ; F9A4= B5 CF 5O CMP $D8,X ; F9A6= D5 D8 UX BCS LF9B2 ; F9A8= B0 08 0. LDA #$05 ; F9AA= A9 05 ). JSR LFC15 ; F9AC= 20 15 FC | JSR LFC13 ; F9AF= 20 13 FC | LF9B2: BNE LF979 ; F9B2= D0 C5 PE DEX ; F9B4= CA J BNE LF9A4 ; F9B5= D0 ED Pm LF9B7: JSR LFBFE ; F9B7= 20 FE FB ~{ BIT $DB ; F9BA= 24 DB $[ BVC LF9C9 ; F9BC= 50 0B P. DEY ; F9BE= 88 LF9BF: INY ; F9BF= C8 H JSR OSBGET ; F9C0= 20 D7 FF W. STA ($CB),Y ; F9C3= 91 CB K CPY $D8 ; F9C5= C4 D8 DX BNE LF9BF ; F9C7= D0 F6 Pv LF9C9: LDA $DC ; F9C9= A5 DC %\ STA $CE ; F9CB= 85 CE N JSR OSBGET ; F9CD= 20 D7 FF W. CMP $CE ; F9D0= C5 CE EN BEQ LF9DB ; F9D2= F0 07 p. BRK db 254 db "SUM?" BRK ; *BUG* Error number wrong, should be 216 LF9DB: ROL $DB ; F9DB= 26 DB $[ RTS ; F9DD= 60 ` LF9DE: INC $00,X ; F9DE= F6 00 v. BNE LF9E4 ; F9E0= D0 02 P. INC $01,X ; F9E2= F6 01 v. LF9E4: LDA $00,X ; F9E4= B5 00 5. CMP $02,X ; F9E6= D5 02 U. BNE LF9EE ; F9E8= D0 04 P. LDA $01,X ; F9EA= B5 01 5. CMP $03,X ; F9EC= D5 03 U. LF9EE: RTS ; F9EE= 60 ` ; UNREACHABLE DEX ; F9EF= CA J JSR LFA4C ; F9F0= 20 4C FA Lz STX $EA ; F9F3= 86 EA j LF9F5: RTS ; F9F5= 60 ` LF9F6: JSR LF932 ; F9F6= 20 32 F9 2y BIT $DD ; F9F9= 24 DD $] BVS LFA49 ; F9FB= 70 4C pL JMP ($00D6) ; F9FD= 6C D6 00 lV. ; *CAT ; ==== STAR_CAT: PHP ; FA00= 08 JSR LFA4C ; FA01= 20 4C FA Lz JSR LFC13 ; FA04= 20 13 FC | LFA07: JSR LFB61 ; FA07= 20 61 FB a{ BVS LFA0E ; FA0A= 70 02 p. PLP ; FA0C= 28 ( RTS ; FA0D= 60 ` LFA0E: BEQ LFA1A ; FA0E= F0 0A p. LDY #$00 ; FA10= A0 00 JSR LF970 ; FA12= 20 70 F9 py JSR LF7DB ; FA15= 20 DB F7 [w BNE LFA33 ; FA18= D0 19 P. LFA1A: JSR LFB9C ; FA1A= 20 9C FB { JSR LFBB5 ; FA1D= 20 B5 FB 5{ JSR LF969 ; FA20= 20 69 F9 iy JSR LF7DB ; FA23= 20 DB F7 [w ROL $DB ; FA26= 26 DB $[ BPL LFA33 ; FA28= 10 09 INX ; FA2A= E8 h JSR LF7E0 ; FA2B= 20 E0 F7 `w LDA $FD,X ; FA2E= B5 FD 5} JSR print_hex_byte ; FA30= 20 F1 F7 qw LFA33: JSR OSNEWL ; FA33= 20 E7 FF g. BNE LFA07 ; FA36= D0 CF PO JMP OSNEWL ; FA38= 4C E7 FF Lg. LFA3B: JSR LF880 ; FA3B= 20 80 F8 x BEQ LFA53 ; FA3E= F0 13 p. RTS ; FA40= 60 ` LDX #$CB ; FA41= A2 CB "K JSR LFA3B ; FA43= 20 3B FA ;z JSR LFA4C ; FA46= 20 4C FA Lz LFA49: JMP ($00CB) ; FA49= 6C CB 00 lK. LFA4C: JSR LF863 ; FA4C= 20 63 F8 CMP #ASCII_CR ; FA4F= C9 0D BEQ LF9F5 ; FA51= F0 A2 LFA53: BRK db 254 db "SYNTAX" BRK ; *BUG* error number wrong, should be 220 LFA5C: SEC ; FA5C= 38 8 LDA $D1 ; FA5D= A5 D1 %Q SBC $CF ; FA5F= E5 CF eO PHA ; FA61= 48 H LDA $D2 ; FA62= A5 D2 %R SBC $D0 ; FA64= E5 D0 eP TAY ; FA66= A8 ( PLA ; FA67= 68 h CLC ; FA68= 18 ADC $CB ; FA69= 65 CB eK STA $CD ; FA6B= 85 CD M TYA ; FA6D= 98 ADC $CC ; FA6E= 65 CC eL STA $CE ; FA70= 85 CE N LDY #$04 ; FA72= A0 04 LFA74: LDA $00CA,Y ; FA74= B9 CA 00 9J. JSR OSBPUT ; FA77= 20 D4 FF T. DEY ; FA7A= 88 BNE LFA74 ; FA7B= D0 F7 Pw LFA7D: LDA ($CF),Y ; FA7D= B1 CF 1O JSR OSBPUT ; FA7F= 20 D4 FF T. INC $CF ; FA82= E6 CF fO BNE LFA88 ; FA84= D0 02 P. INC $D0 ; FA86= E6 D0 fP LFA88: LDX #$CB ; FA88= A2 CB "K JSR LF9DE ; FA8A= 20 DE F9 ^y BNE LFA7D ; FA8D= D0 EE Pn PLP ; FA8F= 28 ( RTS ; FA90= 60 ` LFA91: JSR LF807 ; FA91= 20 07 F8 x LDX #$CB ; FA94= A2 CB "K JSR LFA3B ; FA96= 20 3B FA ;z LDX #$D1 ; FA99= A2 D1 "Q JSR LFA3B ; FA9B= 20 3B FA ;z LDX #$CD ; FA9E= A2 CD "M JSR LF880 ; FAA0= 20 80 F8 x PHP ; FAA3= 08 LDA $CB ; FAA4= A5 CB %K LDX $CC ; FAA6= A6 CC $L PLP ; FAA8= 28 ( BNE LFAAF ; FAA9= D0 04 P. STA $CD ; FAAB= 85 CD M STX $CE ; FAAD= 86 CE N LFAAF: STA $CF ; FAAF= 85 CF O STX $D0 ; FAB1= 86 D0 P JSR LFA4C ; FAB3= 20 4C FA Lz LDX #$C9 ; FAB6= A2 C9 "I LFAB8: PHP ; FAB8= 08 SEI ; FAB9= 78 x JSR LF83E ; FABA= 20 3E F8 >x PHP ; FABD= 08 LDA #$06 ; FABE= A9 06 ). JSR LFC15 ; FAC0= 20 15 FC | LDX #$07 ; FAC3= A2 07 ". JSR LFB4D ; FAC5= 20 4D FB M{ PLP ; FAC8= 28 ( BEQ LFA5C ; FAC9= F0 91 p. LDX #$04 ; FACB= A2 04 ". LFACD: LDA $CE,X ; FACD= B5 CE 5N STA $D2,X ; FACF= 95 D2 R DEX ; FAD1= CA J BNE LFACD ; FAD2= D0 F9 Py STX $D0 ; FAD4= 86 D0 P STX $D1 ; FAD6= 86 D1 Q LDA $D5 ; FAD8= A5 D5 %U BNE LFADE ; FADA= D0 02 P. DEC $D6 ; FADC= C6 D6 FV LFADE: DEC $D5 ; FADE= C6 D5 FU CLC ; FAE0= 18 LFAE1: ROR $D2 ; FAE1= 66 D2 fR SEC ; FAE3= 38 8 LDX #$FF ; FAE4= A2 FF ". LDA $D5 ; FAE6= A5 D5 %U SBC $D3 ; FAE8= E5 D3 eS STA $CF ; FAEA= 85 CF O LDA $D6 ; FAEC= A5 D6 %V SBC $D4 ; FAEE= E5 D4 eT PHP ; FAF0= 08 ROR $D2 ; FAF1= 66 D2 fR PLP ; FAF3= 28 ( BCC LFAFC ; FAF4= 90 06 CLC ; FAF6= 18 BEQ LFAFC ; FAF7= F0 03 p. STX $CF ; FAF9= 86 CF O SEC ; FAFB= 38 8 LFAFC: ROR $D2 ; FAFC= 66 D2 fR INX ; FAFE= E8 h JSR LFB0E ; FAFF= 20 0E FB { INC $D0 ; FB02= E6 D0 fP INC $D4 ; FB04= E6 D4 fT INC $CC ; FB06= E6 CC fL ROL $D2 ; FB08= 26 D2 $R BCS LFAE1 ; FB0A= B0 D5 0U PLP ; FB0C= 28 ( RTS ; FB0D= 60 ` LFB0E: LDX #$07 ; FB0E= A2 07 ". JSR LFB4D ; FB10= 20 4D FB M{ STX $DC ; FB13= 86 DC \ LDY #$04 ; FB15= A0 04 LFB17: LDA #$2A ; FB17= A9 2A )* JSR OSBPUT ; FB19= 20 D4 FF T. DEY ; FB1C= 88 BNE LFB17 ; FB1D= D0 F8 Px LFB1F: LDA ($C9),Y ; FB1F= B1 C9 1I JSR OSBPUT ; FB21= 20 D4 FF T. INY ; FB24= C8 H CMP #ASCII_CR ; FB25= C9 0D I. BNE LFB1F ; FB27= D0 F6 Pv LDY #$08 ; FB29= A0 08 LFB2B: LDA $00CA,Y ; FB2B= B9 CA 00 9J. JSR OSBPUT ; FB2E= 20 D4 FF T. DEY ; FB31= 88 BNE LFB2B ; FB32= D0 F7 Pw JSR LFB54 ; FB34= 20 54 FB T{ BIT $D2 ; FB37= 24 D2 $R BVC LFB46 ; FB39= 50 0B P. DEY ; FB3B= 88 LFB3C: INY ; FB3C= C8 H LDA ($D3),Y ; FB3D= B1 D3 1S JSR OSBPUT ; FB3F= 20 D4 FF T. CPY $CF ; FB42= C4 CF DO BNE LFB3C ; FB44= D0 F6 Pv LFB46: LDA $DC ; FB46= A5 DC %\ JSR OSBPUT ; FB48= 20 D4 FF T. LDX #$04 ; FB4B= A2 04 ". LFB4D: STX ATOM_PPI_PORT_C ; FB4D= 8E 02 70 ..p LDX #$78 ; FB50= A2 78 "x BNE LFB56 ; FB52= D0 02 P. LFB54: LDX #$1E ; FB54= A2 1E ". LFB56: JSR Wait_until_no_VSync ; FB56= 20 3F FE ?~ DEX ; FB59= CA J BNE LFB56 ; FB5A= D0 FA Pz RTS ; FB5C= 60 ` LFB5D: LDX #$06 ; FB5D= A2 06 ". BNE LFB56 ; FB5F= D0 F5 Pu LFB61: BIT ATOM_PPI_PORT_B ; FB61= 2C 01 70 ,.p BPL LFB61 ; FB64= 10 FB { BVC LFB61 ; FB66= 50 F9 Py LFB68: LDY #$00 ; FB68= A0 00 STA $C3 ; FB6A= 85 C3 C LDA #$10 ; FB6C= A9 10 ). STA $C2 ; FB6E= 85 C2 B LFB70: BIT ATOM_PPI_PORT_B ; FB70= 2C 01 70 ,.p BPL LFB84 ; FB73= 10 0F BVC LFB84 ; FB75= 50 0D P. JSR LFC92 ; FB77= 20 92 FC | BCS LFB68 ; FB7A= B0 EC 0l DEC $C3 ; FB7C= C6 C3 FC BNE LFB70 ; FB7E= D0 F0 Pp DEC $C2 ; FB80= C6 C2 FB BNE LFB70 ; FB82= D0 EC Pl LFB84: BVS LFB87 ; FB84= 70 01 p. RTS ; FB86= 60 ` LFB87: LDY #$04 ; FB87= A0 04 PHP ; FB89= 08 JSR LFBB7 ; FB8A= 20 B7 FB 7{ PLP ; FB8D= 28 ( LDY #$04 ; FB8E= A0 04 LDA #$2A ; FB90= A9 2A )* LFB92: CMP $00D3,Y ; FB92= D9 D3 00 YS. BNE LFB9A ; FB95= D0 03 P. DEY ; FB97= 88 BNE LFB92 ; FB98= D0 F8 Px LFB9A: RTS ; FB9A= 60 ` LFB9B: INY ; FB9B= C8 H LFB9C: JSR OSBGET ; FB9C= 20 D7 FF W. STA $00ED,Y ; FB9F= 99 ED 00 .m. CMP #ASCII_CR ; FBA2= C9 0D I. BNE LFB9B ; FBA4= D0 F5 Pu LDY #$FF ; FBA6= A0 FF LFBA8: INY ; FBA8= C8 H LDA ($C9),Y ; FBA9= B1 C9 1I CMP $00ED,Y ; FBAB= D9 ED 00 Ym. BNE LFB9A ; FBAE= D0 EA Pj CMP #ASCII_CR ; FBB0= C9 0D I. BNE LFBA8 ; FBB2= D0 F4 Pt RTS ; FBB4= 60 ` LFBB5: LDY #$08 ; FBB5= A0 08 LFBB7: JSR OSBGET ; FBB7= 20 D7 FF W. STA $00D3,Y ; FBBA= 99 D3 00 .S. DEY ; FBBD= 88 BNE LFBB7 ; FBBE= D0 F7 Pw RTS ; FBC0= 60 ` ; OSBGET HANDLER ; ============== OSBGET_handler: STX $EC ; FBC1= 86 EC l STY $C3 ; FBC3= 84 C3 C PHP ; FBC5= 08 SEI ; FBC6= 78 x LFBC7: LDA #$78 ; FBC7= A9 78 )x STA $C0 ; FBC9= 85 C0 @ LFBCB: JSR LFC92 ; FBCB= 20 92 FC | BCC LFBC7 ; FBCE= 90 F7 w INC $C0 ; FBD0= E6 C0 f@ BPL LFBCB ; FBD2= 10 F7 w LFBD4: LDA #$53 ; FBD4= A9 53 )S STA $C4 ; FBD6= 85 C4 D LDX #$00 ; FBD8= A2 00 ". LDY ATOM_PPI_PORT_C ; FBDA= AC 02 70 ,.p LFBDD: JSR LFCA2 ; FBDD= 20 A2 FC "| BEQ LFBE2 ; FBE0= F0 00 p. LFBE2: BEQ LFBE5 ; FBE2= F0 01 p. INX ; FBE4= E8 h LFBE5: DEC $C4 ; FBE5= C6 C4 FD BNE LFBDD ; FBE7= D0 F4 Pt CPX #$0C ; FBE9= E0 0C `. ROR $C0 ; FBEB= 66 C0 f@ BCC LFBD4 ; FBED= 90 E5 e LDA $C0 ; FBEF= A5 C0 %@ PLP ; FBF1= 28 ( LDY $C3 ; FBF2= A4 C3 $C LDX $EC ; FBF4= A6 EC $l LFBF6: PHA ; FBF6= 48 H CLC ; FBF7= 18 ADC $DC ; FBF8= 65 DC e\ STA $DC ; FBFA= 85 DC \ PLA ; FBFC= 68 h RTS ; FBFD= 60 ` LFBFE: LDA $CD ; FBFE= A5 CD %M BMI LFC0A ; FC00= 30 08 0. LDA $D4 ; FC02= A5 D4 %T STA $CB ; FC04= 85 CB K LDA $D5 ; FC06= A5 D5 %U STA $CC ; FC08= 85 CC L LFC0A: RTS ; FC0A= 60 ` ; OSFIND HANDLER ; ============== OSFIND_handler: CMP #$C0 BEQ LFC13 ; Jump with OPENUP LDA #$06 BNE LFC15 ; A = $06 for OPENIN/OPENOUT/CLOSE LFC13: LDA #$04 ; A = $04 for OPENUP LFC15: LDX #$07 STX ATOM_PPI_PORT_C BIT $EA BNE LFC4B CMP #$05 BEQ print_REWIND_TAPE BCS print_RECORD_TAPE JSR Print_inline_text print_PLAY_TAPE: db "PLAY" BNE print_TAPE print_RECORD_TAPE: JSR Print_inline_text db "RECORD" BNE print_TAPE print_REWIND_TAPE: JSR Print_inline_text db "REWIND" NOP print_TAPE: JSR Print_inline_text db " TAPE" NOP LFC4B: JSR OSRDCH JMP OSNEWL ; OSBPUT HANDLER ; ============== OSBPUT_handler: STX $EC ; FC51= 86 EC l STY $C3 ; FC53= 84 C3 C PHP ; FC55= 08 SEI ; FC56= 78 x PHA ; FC57= 48 H JSR LFBF6 ; FC58= 20 F6 FB v{ STA $C0 ; FC5B= 85 C0 @ JSR LFCAD ; FC5D= 20 AD FC -| LDA #$0A ; FC60= A9 0A ). STA $C1 ; FC62= 85 C1 A CLC ; FC64= 18 loop_FC65: BCC LFC71 ; FC65= 90 0A LDX #$07 ; FC67= A2 07 ". STX ATOM_PPI_PORT_C ; FC69= 8E 02 70 ..p JSR LFCAF ; FC6C= 20 AF FC /| BMI LFC84 ; FC6F= 30 13 0. LFC71: LDY #4 loop_FC73: LDA #4 LFC75: STA ATOM_PPI_PORT_C JSR LFCAD INC ATOM_PPI_PORT_C JSR LFCAD DEY BNE loop_FC73 LFC84: SEC ; FC84= 38 8 ROR $C0 ; FC85= 66 C0 f@ DEC $C1 ; FC87= C6 C1 FA BNE loop_FC65 ; FC89= D0 DA PZ LDY $C3 ; FC8B= A4 C3 $C LDX $EC ; FC8D= A6 EC $l LFC8F: PLA ; FC8F= 68 h PLP ; FC90= 28 ( RTS ; FC91= 60 ` LFC92: LDX #0 LDY ATOM_PPI_PORT_C LFC97: INX BEQ RTS_FCA1 JSR LFCA2 BEQ LFC97 CPX #8 RTS_FCA1: RTS ; FCA1= 60 ` LFCA2: STY $C5 ; FCA2= 84 C5 E LDA ATOM_PPI_PORT_C ; FCA4= AD 02 70 -.p TAY ; FCA7= A8 ( EOR $C5 ; FCA8= 45 C5 EE AND #$20 ; FCAA= 29 20 ) RTS ; FCAC= 60 ` LFCAD: LDX #0 LFCAF: LDA #$10 loop_FCB1: BIT ATOM_PPI_PORT_C BEQ loop_FCB1 loop_FCB6: BIT ATOM_PPI_PORT_C BNE loop_FCB6 DEX BPL loop_FCB1 RTS handle_characters: CMP #ASCII_ACK BEQ VDU_enable ; - enable VDU CMP #ASCII_NAK BEQ VDU_disable ; - disable VDU LDY $E0 BMI LFCEE ; VDU is disabled CMP #ASCII_ESC BEQ VDU_enable ; - reset VDU CMP #ASCII_BEL BEQ bell ; - ring bell JSR cursor_off ; Remove cursor LDX #$0A JSR index_into_WRCH_character_translation_table BNE do_printable_character JMP do_control_character VDU_enable: CLC LDX #0 STX ATOM_PPI_PORT_A ; VDU_disable: LDX #2 LFCE8: PHP ; ASL current_line,X ; PLP ; ROR current_line,X ; LFCEE: RTS bell: LDA #5 TAY speaker_outer_loop: STA ATOM_PPI_CTRL speaker_inner_loop: DEX BNE speaker_inner_loop EOR #$01 ; toggle speaker bit INY BPL speaker_outer_loop RTS NMI_handler: PHA JMP (userv) ; Hand on to Atom NMIV ; Store character in display RAM ; ------------------------------ do_printable_character: CMP #ASCII_SP BCC cursor_off ; If <' ', ADC #$1F ; Add $20 BMI LFD0C EOR #$60 ; If <&80, toggle b6/b5 LFD0C: JSR Wait_for_VSync ; Wait for VSync STA (current_line),Y ; Store in video RAM LFD11: INY ; FD11= C8 H CPY #$20 ; FD12= C0 20 @ BCC LFD1B ; FD14= 90 05 JSR LFDC5 ; FD16= 20 C5 FD E} LFD19: LDY #$00 ; FD19= A0 00 LFD1B: STY $E0 ; FD1B= 84 E0 ` cursor_off: PHA ; JSR Wait_for_VSync ; LDA (current_line),Y ; EOR $E1 ; STA (current_line),Y ; PLA ; RTS ; LFD29: JSR LFE0E ; FD29= 20 0E FE ~ LDA #$20 ; FD2C= A9 20 ) JSR Wait_for_VSync ; FD2E= 20 44 FE D~ STA (current_line),Y ; FD31= 91 DE ^ BPL LFD1B ; FD33= 10 E6 f LFD35: JSR LFE0E ; FD35= 20 0E FE ~ JMP LFD1B ; FD38= 4C 1B FD L.} LFD3B: JSR LFDC5 ; FD3B= 20 C5 FD E} LFD3E: LDY $E0 ; FD3E= A4 E0 $` BPL LFD1B ; FD40= 10 D9 Y LFD42: LDY #$80 ; FD42= A0 80 STY $E1 ; FD44= 84 E1 a LDY #$00 ; FD46= A0 00 STY ATOM_PPI_PORT_A ; FD48= 8C 00 70 ..p LDA #$20 ; FD4B= A9 20 ) LFD4D: STA screen_RAM,Y ; FD4D= 99 00 40 ..@ STA screen_RAM+$100,Y ; FD50= 99 00 41 ..A INY ; FD53= C8 H BNE LFD4D ; FD54= D0 F7 Pw LFD56: LDA #$40 ; FD56= A9 40 )@ LDY #$00 ; FD58= A0 00 STA current_line+1 ; FD5A= 85 DF _ STY current_line ; FD5C= 84 DE ^ BEQ LFD1B ; FD5E= F0 BB p; LFD60: JSR LFE13 ; FD60= 20 13 FE ~ JMP LFD1B ; FD63= 4C 1B FD L.} LFD66: CLC ; FD66= 18 LDA #$10 ; FD67= A9 10 ). STA $E6 ; FD69= 85 E6 f LFD6B: LDX #$08 ; FD6B= A2 08 ". JSR LFCE8 ; FD6D= 20 E8 FC h| JMP cursor_off ; FD70= 4C 1D FD L.} LFD73: LDA $E7 ; FD73= A5 E7 %g EOR #$60 ; FD75= 49 60 I` STA $E7 ; FD77= 85 E7 g BCS LFD84 ; FD79= B0 09 0. LFD7B: AND #$05 ; FD7B= 29 05 ). ROL ATOM_PPI_PORT_B ; FD7D= 2E 01 70 ..p ROL A ; FD80= 2A * JSR handle_characters ; FD81= 20 BF FC ?| LFD84: JMP LFE73 ; FD84= 4C 73 FE Ls~ LFD87: LDY $E0 ; FD87= A4 E0 $` JSR Wait_for_VSync ; FD89= 20 44 FE D~ LDA (current_line),Y ; FD8C= B1 DE 1^ EOR $E1 ; FD8E= 45 E1 Ea BMI LFD94 ; FD90= 30 02 0. EOR #$60 ; FD92= 49 60 I` LFD94: SBC #$20 ; FD94= E9 20 i JMP LFDC2 ; FD96= 4C C2 FD LB} LFD99: LDA #$5F ; FD99= A9 5F )_ LFD9B: EOR #$20 ; FD9B= 49 20 I BNE LFDC2 ; FD9D= D0 23 P# LFD9F: EOR $E7 ; FD9F= 45 E7 Eg LFDA1: BIT ATOM_PPI_PORT_B ; FDA1= 2C 01 70 ,.p BMI LFDA8 ; FDA4= 30 02 0. EOR #$60 ; FDA6= 49 60 I` LFDA8: JMP LFDB8 ; FDA8= 4C B8 FD L8} LFDAB: ADC #$39 ; FDAB= 69 39 i9 BCC LFDA1 ; FDAD= 90 F2 r LFDAF: EOR #$10 ; FDAF= 49 10 I. LFDB1: BIT ATOM_PPI_PORT_B ; FDB1= 2C 01 70 ,.p BMI LFDB8 ; FDB4= 30 02 0. EOR #$10 ; FDB6= 49 10 I. LFDB8: CLC ; FDB8= 18 ADC #$20 ; FDB9= 69 20 i LFDBB: BIT ATOM_PPI_PORT_B ; FDBB= 2C 01 70 ,.p BVS LFDC2 ; FDBE= 70 02 p. AND #$1F ; FDC0= 29 1F ). LFDC2: JMP LFE39 ; FDC2= 4C 39 FE L9~ LFDC5: LDA current_line ; FDC5= A5 DE %^ LDY current_line+1 ; FDC7= A4 DF $_ CPY #$41 ; FDC9= C0 41 @A BCC LFE05 ; FDCB= 90 38 8 CMP #$E0 ; FDCD= C9 E0 I` BCC LFE05 ; FDCF= 90 34 4 LDY $E6 ; FDD1= A4 E6 $f BMI LFDE1 ; FDD3= 30 0C 0. DEY ; FDD5= 88 BNE LFDDF ; FDD6= D0 07 P. LFDD8: JSR LFE4A ; FDD8= 20 4A FE J~ BCS LFDD8 ; FDDB= B0 FB 0{ LDY #$10 ; FDDD= A0 10 LFDDF: STY $E6 ; FDDF= 84 E6 f LFDE1: LDY #$20 ; FDE1= A0 20 JSR Wait_until_no_VSync ; FDE3= 20 3F FE ?~ LFDE6: LDA screen_RAM,Y ; FDE6= B9 00 40 9.@ STA $3FE0,Y ; FDE9= 99 E0 3F .`? INY ; FDEC= C8 H BNE LFDE6 ; FDED= D0 F7 Pw JSR Wait_for_VSync ; FDEF= 20 44 FE D~ LFDF2: LDA screen_RAM+$100,Y ; FDF2= B9 00 41 9.A STA $40E0,Y ; FDF5= 99 E0 40 .`@ INY ; FDF8= C8 H BNE LFDF2 ; FDF9= D0 F7 Pw LDY #$1F ; FDFB= A0 1F LDA #$20 ; FDFD= A9 20 ) LFDFF: STA (current_line),Y ; FDFF= 91 DE ^ DEY ; FE01= 88 BPL LFDFF ; FE02= 10 FB { RTS ; FE04= 60 ` LFE05: ADC #$20 ; FE05= 69 20 i STA current_line ; FE07= 85 DE ^ BNE LFE0D ; FE09= D0 02 P. INC current_line+1 ; FE0B= E6 DF f_ LFE0D: RTS ; FE0D= 60 ` LFE0E: DEY ; FE0E= 88 BPL LFE2A ; FE0F= 10 19 LDY #$1F ; FE11= A0 1F LFE13: LDA current_line ; FE13= A5 DE %^ BNE LFE22 ; FE15= D0 0B P. LDX current_line+1 ; FE17= A6 DF $_ CPX #$40 ; FE19= E0 40 `@ BNE LFE22 ; FE1B= D0 05 P. PLA ; FE1D= 68 h PLA ; FE1E= 68 h JMP LFD3E ; FE1F= 4C 3E FD L>} LFE22: SBC #$20 ; FE22= E9 20 i STA current_line ; FE24= 85 DE ^ BCS LFE2A ; FE26= B0 02 0. DEC current_line+1 ; FE28= C6 DF F_ LFE2A: RTS ; FE2A= 60 ` ; Write a character to VDU ; ------------------------ LFE2B: JSR LFED4 ; Send to printer PHP ; FE2E= 08 PHA ; FE2F= 48 H CLD ; FE30= D8 X STY $E5 ; FE31= 84 E5 e STX $E4 ; FE33= 86 E4 d JSR handle_characters ; FE35= 20 BF FC ?| PLA ; FE38= 68 h LFE39: LDX $E4 ; FE39= A6 E4 $d LDY $E5 ; FE3B= A4 E5 $e PLP ; FE3D= 28 ( RTS ; FE3E= 60 ` Wait_until_no_VSync: BIT ATOM_PPI_PORT_C BPL Wait_until_no_VSync ; Wait until no VSync Wait_for_VSync: BIT ATOM_PPI_PORT_C BMI Wait_for_VSync ; Wait until VSync RTS LFE4A: LDY #$3B ; FE4A= A0 3B ; CLC ; FE4C= 18 LDA #$20 ; FE4D= A9 20 ) LFE4F: LDX #$0A ; FE4F= A2 0A ". LFE51: BIT ATOM_PPI_PORT_B ; FE51= 2C 01 70 ,.p BEQ LFE5E ; FE54= F0 08 p. INC ATOM_PPI_PORT_A ; FE56= EE 00 70 n.p DEY ; FE59= 88 DEX ; FE5A= CA J BNE LFE51 ; FE5B= D0 F4 Pt LSR A ; LFE5E: PHP ; PHA ; LDA ATOM_PPI_PORT_A AND #$F0 ; STA ATOM_PPI_PORT_A PLA PLP BNE LFE4F ; FE6A= D0 E3 Pc RTS ; FE6C= 60 ` ; OSRDCH HANDLER ; ============== RDCHV_handler: PHP ; FE6D= 08 CLD ; FE6E= D8 X STX $E4 ; FE6F= 86 E4 d STY $E5 ; FE71= 84 E5 e LFE73: BIT ATOM_PPI_PORT_C ; FE73= 2C 02 70 ,.p BVC LFE7D ; FE76= 50 05 P. JSR LFE4A ; FE78= 20 4A FE J~ BCC LFE73 ; FE7B= 90 F6 v LFE7D: JSR LFB5D ; FE7D= 20 5D FB ]{ LFE80: JSR LFE4A BCS LFE80 JSR LFE4A BCS LFE80 LFE8A: TYA ; FE8A= 98 LDX #$17 ; FE8B= A2 17 ". JSR index_into_WRCH_character_translation_table ; FE8D= 20 9E FE ~ do_control_character: LDA LFEBC,X STA vector_0xE2 LDA #>LFD11 STA vector_0xE2+1 TYA JMP (vector_0xE2) LFE9D: DEX index_into_WRCH_character_translation_table: CMP WRCH_character_translation_table,X BCC LFE9D RTS WRCH_character_translation_table: db $00 db $08 db $09 db $0A ; WRCH character translation table db $0B db $0C db $0D db $0E db $0F db $1E db $7F db $00 db $01 db $05 db $06 ; RDCH character translation table db $08 db $0E db $0F db $10 db $11 db $1C db $20 db $21 db $3B ; WRCH and RDCH character translation dispatch table ; Low byte of addresses - high byte is LFD11 DIV 256 ; -------------------------------------------------- LFEBC: ; WRCH translation addresses db VIA_T1_divisor STA ATOM_VIA_T1CH ; LDA #$40 STA ATOM_VIA_ACR ; AuxCtrl= LDA #$C0 STA ATOM_VIA_IER ; Enable T1 IRQs LDA #0 LDX #4 ; set_TIME_to_zero_loop: STA $0300,X DEX BPL set_TIME_to_zero_loop ; Set TIME to zero STA VDU_queue_length STA sound_duration ; Set SOUND duration to zero STA $FF ; Clear Escape flag LDA #$0E STA $FD ; *BUG* Should fetch from $8007 LDA #$80 STA $FE ; Point last error to BASIC copyright message LDA $C000 ; Is extension ROM present? CMP #$AA BNE LFF85 ; No, skip past JSR $C001 CLI ; Call extension ROM LFF85: JMP $8000 ; Enter BASIC at $8000 ; =============== Default_vectors: ; $200 - NMIV, initialised by DOS ; $202 - BRKV, initialised by BASIC dw $8000 ; $204 - IRQ1V dw IRQ2_handler ; $206 - IRQ2V dw CLI_handler ; $208 - CLIV dw OSBYTE_handler ; $20A - BYTEV dw OSWORD_handler ; $20C - WORDV dw OSWRCH_handler ; $20E - WRCHV dw RDCHV_handler ; $210 - RDCHV dw OSFILE_handler ; $212 - FILEV dw OSARGS_handler ; $214 - ARGSV dw OSBGET_handler ; $216 - BGETV dw OSBPUT_handler ; $218 - BPUTV dw IRQ2_handler ; $21A - GBPBV dw OSFIND_handler ; $21C - FINDV ; $21E - FSCV ; =========== IRQ_handler: STA IRQ_A_store PLA PHA ; Get pushed flags from stack AND #$10 BNE LFFBA ; Jump if BRK occured LDA ATOM_VIA_IFR AND #$60 ; Check 6522 Timer1/Timer2 interupt status BEQ LFFB4 JMP ATOM_VIA_INTERRUPT ; Jump to process 6522 interupt LFFB4: LDA IRQ_A_store PHA JMP (irq1v) ; Unrecognised, pass on to IRQ1V ; BRK occured, set up error pointer and pass on to BRKV ; ----------------------------------------------------- LFFBA: LDA IRQ_A_store PLP PLA SEC SBC #$01 STA $FD PLA SBC #$00 STA $FE ; $FD/E=>error OSBRK: JMP (brkv) ; Pass to BRKV OSIRQ2: JMP (irq2v) ; Pass to IRQ2V ; Filing system entry points ; -------------------------- OSFIND: JMP (findv) OSGBPB: JMP (gbpbv) OSBPUT: JMP (bputv) OSBGET: JMP (bgetv) OSARGS: JMP (argsv) OSFILE: JMP (filev) ; ; MOS I/O entry points ; -------------------- OSRDCH: JMP (rdchv) OSASCI: CMP #ASCII_CR BNE OSWRCH OSNEWL: JSR OSWRCH OSWRCR: LDA #ASCII_CR OSWRCH: JMP (wrchv) OSWORD: JMP (wordv) OSBYTE: JMP (bytev) OS_CLI: JMP (cliv) NMI: dw NMI_handler RESET: dw RESET_handler IRQ: dw IRQ_handler ; ] ; NEXT ; OSCLI"Save "+outfile$+" "+STR$~mcode%+" "+STR$~O%+" "+STR$~load%+" "+STR$~load% ; ON ERROR ON ERROR OFF ; END ; *Quit ; DEFFNif(A%) ; IFA% ; z%=-1 ; =opt% ELSE z%=P% ; =opt% ; DEFFNendif ; IFz%=-1 ; =opt% ELSE z%=P%-z% ; P%=P%-z% ; O%=O%-z% ; =opt% ; DEFFNelse ; IFz%=-1 ; z%=P% ; =opt% ELSE z%=P%-z% ; P%=P%-z% ; O%=O%-z% ; z%=-1 ; =opt%