Created
July 30, 2014 14:14
-
-
Save anonymous/4b85bd8069a2bfaaea9f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8000 org $8000 ; reset | |
8000 7EBB3C call_HWINIT jmp HWINIT ; reset | |
8003 7EBB88 call_SWINIT jmp SWINIT ; set up $8f - $9b | |
8006 7EBBE5 POLCAT jmp INCH ; scan keyboard (A) | |
8009 7EBBB5 call_CBLINK jmp CBLINK ; blink cursor | |
800C 7EBCAB CHROUT jmp OUTCH ; write to VDU (A) | |
800F 7EBD1A call_LPOUT jmp LPOUT ; write to printer (A) | |
8012 7EBD52 call_JOYIN jmp JOYIN ; update joysticks | |
8015 7EBDCF call_CASON jmp CASON ; motoron | |
8018 7EBDDC call_CASOFF jmp CASOFF ; motoroff | |
801B 7EBE68 call_WRTLDR jmp WRTLDR ; write leader | |
801E 7EBE12 call_CBOUT jmp CBOUT ; byte out (A) | |
8021 7EBDE7 call_CSRDON jmp CSRDON ; read leader | |
8024 7EBDAD call_CBIN jmp CBIN ; byte in (A) | |
8027 7EBDA5 call_BITIN jmp BITIN ; bit in (C) | |
802A 7EBE7B call_SERIN jmp SERIN ; read serial (A) | |
802D 7EBE98 call_SEROUT jmp SEROUT ; write serial (A) | |
8030 7EBEA6 call_SERSET jmp SERSET ; baud rate select | |
8033 464FD247CF5245CDA7454C53C549C6444154C15052494ED44FCE494E5055D445 reserved_words fcc /FO/,$d2,/G/,$cf,/RE/,$cd,$a7,/ELS/,$c5,/I/,$c6,/DAT/,$c1,/PRIN/,$d4,/O/,$ce,/INPU/,$d4,/E/ ; FOR 80 | |
8053 4EC44E4558D44449CD524541C44C45D45255CE524553544F52C55245545552CE fcc /N/,$c4,/NEX/,$d4,/DI/,$cd,/REA/,$c4,/LE/,$d4,/RU/,$ce,/RESTOR/,$c5,/RETUR/,$ce | |
8073 53544FD0504F4BC5434F4ED44C4953D4434C4541D24E45D74445C6434C4F41C4 fcc /STO/,$d0,/POK/,$c5,/CON/,$d4,/LIS/,$d4,/CLEA/,$d2,/NE/,$d7,/DE/,$c6,/CLOA/,$c4 ; STOP 92 | |
8093 43534156C54F5045CE434C4F53C54C4C4953D45345D452455345D4434CD34D4F fcc /CSAV/,$c5,/OPE/,$ce,/CLOS/,$c5,/LLIS/,$d4,/SE/,$d4,/RESE/,$d4,/CL/,$d3,/MO/ ; CSAVE 9A | |
80B3 544FD2534F554EC441554449CF455845C3534B4950C64445CC454449D454524F fcc /TO/,$d2,/SOUN/,$c4,/AUDI/,$cf,/EXE/,$c3,/SKIP/,$c6,/DE/,$cc,/EDI/,$d4,/TRO/ | |
80D3 CE54524F46C64C494EC550434CD3505345D45052455345D45343524545CE5043 fcc $ce,/TROF/,$c6,/LIN/,$c5,/PCL/,$d3,/PSE/,$d4,/PRESE/,$d4,/SCREE/,$ce,/PC/ | |
80F3 4C4541D2434F4C4FD2434952434CC55041494ED44745D45055D4445241D75043 fcc /LEA/,$d2,/COLO/,$d2,/CIRCL/,$c5,/PAIN/,$d4,/GE/,$d4,/PU/,$d4,/DRA/,$d7,/PC/ | |
8113 4F50D9504D4F44C5504C41D9444C4F41C452454E55CD544142A854CF5355C246 fcc /OP/,$d9,/PMOD/,$c5,/PLA/,$d9,/DLOA/,$c4,/RENU/,$cd,/TAB/,$a8,/T/,$cf,/SU/,$c2,/F/ | |
8133 CE544845CE4E4FD4535445D04F46C6ABADAAAFDE414EC44FD2BEBDBC5553494E fcc $ce,/THE/,$ce,/NO/,$d4,/STE/,$d0,/OF/,$c6,$ab,$ad,$aa,$af,$de,/AN/,$c4,/O/,$d2,$be,$bd,$bc,/USIN/ | |
8153 C7 fcc $c7 | |
8154 844885B986168616861686478613903D8675872B853288298A8B877786BC85A5 reserved_dispatch fdb FOR_dispatch,GO_dispatch,REM_ELSE_dispatch,REM_ELSE_dispatch,REM_ELSE_dispatch,IF_dispatch,DATA_dispatch,PRINT_dispatch,ON_dispatch,INPUT_dispatch,END_dispatch,NEXT_dispatch,DIM_dispatch,READ_dispatch,LET_dispatch,RUN_dispatch ; for go rem ' | |
8174 851485F385398E9D85608EAA857184159C81B6D4B682B828B64C8EA4B9D2BA03 fdb RESTORE_dispatch,RETURN_dispatch,STOP_dispatch,POKE_dispatch,CONT_dispatch,LIST_dispatch,CLEAR_dispatch,NEW_dispatch,DEF_dispatch,CLOAD_dispatch,CSAVE_dispatch,OPEN_dispatch,CLOSE_dispatch,LLIST_dispatch,SET_dispatch,RESET_dispatch ; restore return stop poke | |
8194 BA5FB981BA9ABADFB770B81E9D6199659AD99ADAA749A8C0A6EFA6F3A9FEAA19 fdb CLS_dispatch,MOTOR_dispatch,SOUND_dispatch,AUDIO_dispatch,EXEC_dispatch,SKIPF_dispatch,DEL_dispatch,EDIT_dispatch,TRON_dispatch,TROFF_dispatch,LINE_dispatch,PCLS_dispatch,PSET_dispatch,PRESET_dispatch,SCREEN_dispatch,PCLEAR_dispatch ; cls motor sound audio | |
81B4 A8D4B238AC87AAF0AAF3B051AABEA9AFADBDA0499DFA fdb COLOR_dispatch,CIRCLE_dispatch,PAINT_dispatch,GET_dispatch,PUT_dispatch,DRAW_dispatch,PCOPY_dispatch,PMODE_dispatch,PLAY_dispatch,DLOAD_dispatch,RENUM_dispatch ; color circle paint get | |
81CA 5347CE494ED44142D3504FD3524EC45351D24C4FC74558D05349CE434FD35441 function_words fcc /SG/,$ce,/IN/,$d4,/AB/,$d3,/PO/,$d3,/RN/,$c4,/SQ/,$d2,/LO/,$c7,/EX/,$d0,/SI/,$ce,/CO/,$d3,/TA/ ; SGN FF80 | |
81EA CE4154CE504545CB4C45CE535452A45641CC4153C3434852A4454FC64A4F5953 fcc $ce,/AT/,$ce,/PEE/,$cb,/LE/,$ce,/STR/,$a4,/VA/,$cc,/AS/,$c3,/CHR/,$a4,/EO/,$c6,/JOYS/ | |
820A 54CB4649D8484558A44C454654A45249474854A44D4944A4504F494ED4494E4B fcc /T/,$cb,/FI/,$d8,/HEX/,$a4,/LEFT/,$a4,/RIGHT/,$a4,/MID/,$a4,/POIN/,$d4,/INK/ | |
822A 4559A44D45CD5641525054D2494E5354D254494D45D250504F494ED453545249 fcc /EY/,$a4,/ME/,$cd,/VARPT/,$d2,/INST/,$d2,/TIME/,$d2,/PPOIN/,$d4,/STRI/ | |
824A 4E47A45553D2 fcc /NG/,$a4,/US/,$d2 | |
8250 94259499943E9ADE97729697923C971397D197CB981698778E968DC78C408E5C function_dispatch fdb SGN_dispatch,INT_dispach,ABS_dispatch,POS_dispatch,RND_dispatch,SQR_dispatch,LOG_dispatch,EXP_dispatch,SIN_dispatch,COS_dispatch,TAN_dispatch,ATN_dispatch,PEEK_dispatch,LEN_dispatch,STRstr_dispatch,VAL_dispatch ; sgn int abs pos | |
8270 8DE68DD2B800BB0D9956A00E8DF18E0E8E15BA44B7968C319AF49BB49D59A6C7 fdb ASC_dispatch,CHRstr_dispatch,EOF_dispatch,JOYSTK_dispatch,FIX_dispatch,HEXstr_dispatch,LEFTstr_dispatch,RIGHTstr_dispatch,MIDstr_dispatch,POINT_dispatch,INKEYstr_dispatch,MEM_dispatch,VARPTR_dispatch,INSTR_dispatch,TIMER_dispatch,PPOINT_dispatch ; asc chr$ eof joystk | |
8290 9B849D1D fdb STRINGstr_dispatch,USR_dispatch ; string$ usr | |
8294 79 operator_dispatch fcb $79 ; + | |
8295 910E fdb oper_plus_dispatch | |
8297 79 fcb $79 ; - | |
8298 9105 fdb oper_minus_dispatch | |
829A 7B fcb $7b ; * | |
829B 9275 fdb oper_mul_dispatch | |
829D 7B fcb $7b ; / | |
829E 933C fdb oper_div_dispatch | |
82A0 7F fcb $7f ; ^ | |
82A1 96A0 fdb oper_pow_dispatch | |
82A3 50 fcb $50 ; AND | |
82A4 8A12 fdb AND_dispatch | |
82A6 46 fcb $46 ; OR | |
82A7 8A11 fdb OR_dispatch | |
82A9 4E46534E52474F4446434F564F4D554C425344442F304944544D4F534C535354 errcode_table fcc /NFSNRGODFCOVOMULBSDD/,$2f,/0IDTMOSLSST/ ; * error code strings | |
82C9 434E55464644414F444E494F464D4E4F494544534E45 fcc /CNUFFDAODNIOFMNOIEDSNE/ | |
82DF 204552524F5200 text_error fcc / ERROR/,$00 ; /ERROR / | |
82E6 20494E2000 text_in fcc / IN /,$00 ; / IN / | |
82EB 0D4F4B0D text_ok fcc $0d,/OK/,$0d ; CR/OK/CR | |
82EF 00 fcc $00 | |
82F0 0D425245414B00 text_break fcc $0d,/BREAK/,$00 ; CR/BREAK/ | |
82F7 3064 L_82F7 leax 4,s ; point X past 2 return addresses | |
82F9 C612 L_82F9 ldb #$12 ; size of FOR stack entry | |
82FB 9F0F stx <$0f ; $0f = this entry | |
82FD A684 lda ,x | |
82FF 8080 suba #$80 | |
8301 2615 bne L_8318 ; not a FOR entry | |
8303 AE01 ldx 1,x | |
8305 9F11 stx <$11 ; varptr of control variable | |
8307 9E3B ldx <$3b | |
8309 2709 beq L_8314 ; we were called by NEXT with no variable | |
830B 9C11 cmpx <$11 | |
830D 2709 beq L_8318 ; found a matching entry | |
830F 9E0F ldx <$0f | |
8311 3A abx ; point X to next stack entry | |
8312 20E5 bra L_82F9 ; examine next entry | |
8314 9E11 L_8314 ldx <$11 ; set $3b up with varptr of control variable | |
8316 9F3B stx <$3b ; for unspecified NEXT | |
8318 9E0F L_8318 ldx <$0f | |
831A 4D tsta | |
831B 39 rts | |
831C 8D17 L_831C bsr L_8335 ; memory check | |
831E DE41 L_831E ldu <$41 | |
8320 3341 leau 1,u | |
8322 9E43 ldx <$43 | |
8324 3001 leax 1,x | |
8326 A682 L_8326 lda ,-x | |
8328 3602 pshu a | |
832A 9C47 cmpx <$47 | |
832C 26F8 bne L_8326 | |
832E DF45 stu <$45 | |
8330 39 L_8330 rts | |
8331 4F L_8331 clra ; * check if there are B free words of storage left | |
8332 58 lslb | |
8333 D31F addd <$1f ; end of BASIC storage | |
8335 C3003A L_8335 addd #$003a | |
8338 2508 bcs OM_error ; ?OM ERROR | |
833A 10DF17 sts <$17 | |
833D 109317 cmpd <$17 | |
8340 25EE bcs L_8330 ; RTS | |
8342 C60C OM_error ldb #$0c ; ?OM ERROR | |
8344 BD018E system_error jsr >$018e ; user error trap | |
8347 BD0191 jsr >$0191 ; system error trap | |
834A BD8018 jsr call_CASOFF ; cassette relay off | |
834D BDBAC3 jsr L_BAC3 ; disable audio | |
8350 BD8434 jsr reset_stack ; reset stack & bits & pieces | |
8353 0F6F clr <$6f ; DEVN | |
8355 BD90A5 jsr L_90A5 ; initialise virtual DEVN device & new line | |
8358 BD90F8 jsr L_90F8 ; print '?' to DEVN | |
835B 8E82A9 ldx #errcode_table ; error string table | |
835E 3A abx | |
835F 8D3D bsr L_839E ; output to DEVN from ,X+ | |
8361 8D3B bsr L_839E ; output to DEVN from ,X+ | |
8363 8E82DE ldx #text_error - 1 ; 'ERROR' | |
8366 BD90E5 L_8366 jsr out_string ; print string to DEVN | |
8369 9668 lda <$68 ; current line number | |
836B 4C inca | |
836C 2703 beq goto_ok_prompt ; command mode | |
836E BD9573 jsr L_9573 ; print 'IN xxxx' (current line number) | |
8371 BD90A5 goto_ok_prompt jsr L_90A5 ; initialise virtual DEVN device & new line | |
8374 8E82EB ldx #text_ok | |
8377 BD90E5 jsr out_string ; print 'OK' | |
837A BDB5C6 L_837A jsr L_B5C6 ; line input from DEVN | |
837D CEFFFF ldu #$ffff | |
8380 DF68 stu <$68 ; current line number | |
8382 25F6 bcs L_837A ; command mode without 'OK' | |
8384 0D70 tst <$70 ; eof flag | |
8386 10263373 lbne L_B6FD ; close file & return to command mode | |
838A 9FA6 stx <$a6 ; BASIC source pointer | |
838C 9D9F jsr <$9f ; get next character from BASIC source | |
838E 27EA beq L_837A ; command mode without 'OK' | |
8390 2511 bcs L_83A3 ; enter BASIC line | |
8392 C632 ldb #$32 ; ?DS ERROR | |
8394 0D6F tst <$6f ; DEVN | |
8396 26AC bne system_error ; cause error | |
8398 BD8F67 jsr L_8F67 ; tokenize BASIC line | |
839B 7E84D6 jmp L_84D6 ; enter interpreter loop | |
839E A680 L_839E lda ,x+ ; * used by error routine to print error code | |
83A0 7E90FA jmp L_90FA ; output character to DEVN | |
83A3 BD869A L_83A3 jsr L_869A ; read line number & store in $2b | |
83A6 9E2B L_83A6 ldx <$2b | |
83A8 BF02DA stx >$02da | |
83AB BD8F67 jsr L_8F67 ; tokenize BASIC line | |
83AE D703 stb <$03 ; line length | |
83B0 8D4D bsr basic_line_after_2b ; search program for line number in <$2b | |
83B2 2512 bcs L_83C6 ; line number doesn't exist | |
83B4 DC47 ldd <$47 ; address where line needs to go | |
83B6 A384 subd ,x ; subtract next line pointer (-ve result) | |
83B8 D31B addd <$1b ; start of simple variables | |
83BA DD1B std <$1b ; new end of program | |
83BC EE84 ldu ,x | |
83BE 3702 L_83BE pulu a ; move program down, erasing existing line | |
83C0 A780 sta ,x+ | |
83C2 9C1B cmpx <$1b ; start of simple variables | |
83C4 26F8 bne L_83BE | |
83C6 B602DC L_83C6 lda >$02dc | |
83C9 271C beq L_83E7 ; new line is empty | |
83CB DC1B ldd <$1b ; start of simple variables | |
83CD DD43 std <$43 | |
83CF DB03 addb <$03 ; new line length | |
83D1 8900 adca #$00 | |
83D3 DD41 std <$41 | |
83D5 BD831C jsr L_831C ; move memory contents up | |
83D8 CE02D8 ldu #$02d8 | |
83DB 3702 L_83DB pulu a | |
83DD A780 sta ,x+ ; copy new line into space just created | |
83DF 9C45 cmpx <$45 | |
83E1 26F8 bne L_83DB | |
83E3 9E41 ldx <$41 | |
83E5 9F1B stx <$1b ; new end of program | |
83E7 8D36 L_83E7 bsr BasVect1 ; clear variables and reset stack & cmd ptr | |
83E9 8D02 bsr BasVect2 ; set up next line pointers in BASIC program | |
83EB 208D bra L_837A ; command mode without 'OK' | |
83ED 9E19 BasVect2 ldx <$19 ; start of BASIC program | |
83EF EC84 L_83EF ldd ,x | |
83F1 2721 beq L_8414 ; RTS | |
83F3 3304 leau 4,x | |
83F5 A6C0 L_83F5 lda ,u+ | |
83F7 26FC bne L_83F5 | |
83F9 EF84 stu ,x | |
83FB AE84 ldx ,x | |
83FD 20F0 bra L_83EF | |
83FF DC2B basic_line_after_2b ldd <$2b ; * search program for line number in <$2b | |
8401 9E19 ldx <$19 ; start of BASIC program | |
8403 EE84 L_8403 ldu ,x ; * (first line after if it doesn't exist - carry clear if found) | |
8405 2709 beq L_8410 ; end of program | |
8407 10A302 cmpd 2,x ; scan program until line no. is greater | |
840A 2306 bls L_8412 ; than D | |
840C AE84 ldx ,x ; next line | |
840E 20F3 bra L_8403 | |
8410 1A01 L_8410 orcc #$01 | |
8412 9F47 L_8412 stx <$47 | |
8414 39 L_8414 rts | |
8415 26FB NEW_dispatch bne L_8412 ; * NEW | |
8417 9E19 erase_basic ldx <$19 ; start of BASIC program | |
8419 6F80 clr ,x+ | |
841B 6F80 clr ,x+ | |
841D 9F1B stx <$1b ; start of simple variables | |
841F 9E19 BasVect1 ldx <$19 ; start of BASIC program | |
8421 BD85EE jsr L_85EE ; subtract 1 from X & store in $a6 | |
8424 BD0197 L_8424 jsr >$0197 ; PATCH - reset BASIC memory | |
8427 9E27 ldx <$27 ; top of BASIC RAM | |
8429 9F23 stx <$23 ; top of free string space | |
842B BD8514 jsr RESTORE_dispatch ; RESTORE | |
842E 9E1B ldx <$1b ; start of simple variables | |
8430 9F1D stx <$1d ; start of array variables | |
8432 9F1F stx <$1f ; end of BASIC storage | |
8434 8E01A9 reset_stack ldx #$01a9 | |
8437 9F0B stx <$0b | |
8439 AEE4 ldx ,s | |
843B 10DE21 lds <$21 ; stack root / string storage start | |
843E 6FE2 clr ,-s | |
8440 0F2D clr <$2d ; CONT source address | |
8442 0F2E clr <$2e | |
8444 0F08 clr <$08 | |
8446 6E84 jmp ,x | |
8448 8680 FOR_dispatch lda #$80 ; * 16,S address of statement after FOR | |
844A 9708 sta <$08 ; array illegal flag | |
844C BD86BC jsr LET_dispatch ; LET | |
844F BD82F7 jsr L_82F7 ; examine BASIC stack | |
8452 3262 leas 2,s ; lose return address | |
8454 2604 bne L_845A ; no FOR with same control variable already | |
8456 9E0F ldx <$0f | |
8458 3285 leas b,x ; overwrite duplicate FOR entry | |
845A C609 L_845A ldb #$09 | |
845C BD8331 jsr L_8331 ; memory check | |
845F BD861B jsr L_861B ; find end of statement | |
8462 DC68 ldd <$68 ; current line number | |
8464 3416 pshs a,b,x ; push next statement ptr & current line no. | |
8466 C6BC ldb #$bc ; token TO | |
8468 BD89AC jsr CkChar ; skip character in B | |
846B BD8874 jsr L_8874 ; validate numeric expression | |
846E BD8872 jsr L_8872 ; read numeric expression into FPA1 | |
8471 D654 ldb <$54 | |
8473 CA7F orb #$7f ; convert FPA1 back to standard variable | |
8475 D450 andb <$50 | |
8477 D750 stb <$50 | |
8479 108E8480 ldy #jmp_8480 | |
847D 7E891B jmp L_891B ; push FPA1 onto stack & JMP ,Y | |
8480 8E920E jmp_8480 ldx #data_920E ; FP constant 1 | |
8483 BD93BF jsr MOVFM ; load variable into FPA1 (X is varptr) | |
8486 9DA5 jsr <$a5 ; get current character from BASIC source | |
8488 81C1 cmpa #$c1 ; token STEP | |
848A 2605 bne L_8491 ; no STEP value specified | |
848C 9D9F jsr <$9f ; get next character from BASIC source | |
848E BD8872 jsr L_8872 ; read numeric expression into FPA1 | |
8491 BD9418 L_8491 jsr L_9418 ; sets B to -1, 0 or 1 as per sign of FPA1 | |
8494 BD8917 jsr L_8917 ; push B then FPA1 onto stack | |
8497 DC3B ldd <$3b ; varptr of control variable | |
8499 3406 pshs a,b | |
849B 8680 lda #$80 ; FOR signature on stack | |
849D 3402 pshs a | |
849F BD019A run_basic jsr >$019a ; PATCH - get command | |
84A2 1CAF andcc #$af ; unmask interrupts | |
84A4 8D75 bsr scan_key ; scan for BREAK / pause | |
84A6 9EA6 ldx <$a6 ; BASIC source pointer | |
84A8 9F2F stx <$2f ; address of current BASIC statement | |
84AA A680 lda ,x+ | |
84AC 2707 beq L_84B5 ; end of line | |
84AE 813A cmpa #$3a | |
84B0 2724 beq L_84D6 | |
84B2 7E89B4 do_sn_error_84B2 jmp SN_error ; ?SN ERROR | |
84B5 A681 L_84B5 lda ,x++ | |
84B7 9700 sta <$00 ; this will be zero when end reached | |
84B9 10270088 lbeq L_8545 ; end of program | |
84BD EC80 ldd ,x+ | |
84BF DD68 std <$68 ; current line number | |
84C1 9FA6 stx <$a6 ; BASIC source pointer | |
84C3 96AF lda <$af ; trace flag | |
84C5 270F beq L_84D6 ; trace off | |
84C7 865B lda #$5b | |
84C9 BDB54A jsr OUTCHR ; output character to DEVN | |
84CC 9668 lda <$68 ; current line number | |
84CE BD957A jsr print_D ; print unsigned number in D | |
84D1 865D lda #$5d | |
84D3 BDB54A jsr OUTCHR ; output character to DEVN | |
84D6 9D9F L_84D6 jsr <$9f ; get next character from BASIC source | |
84D8 8D02 bsr L_84DC ; interpret statement | |
84DA 20C3 bra run_basic ; interpreter loop | |
84DC 273C L_84DC beq L_851A ; RTS | |
84DE BD0179 jsr >$0179 ; PATCH - interpreter | |
84E1 4D tsta | |
84E2 102A01D6 lbpl LET_dispatch ; variable on LHS (LET) | |
84E6 81BA cmpa #$ba | |
84E8 220B bhi L_84F5 ; not a BASIC command | |
84EA BE0123 ldx >$0123 ; command JMP table | |
84ED 48 lsla | |
84EE 1F89 tfr a,b | |
84F0 3A abx | |
84F1 9D9F jsr <$9f ; get next character from BASIC source | |
84F3 6E94 jmp [,x] | |
84F5 81FF L_84F5 cmpa #$ff | |
84F7 2708 beq L_8501 ; function | |
84F9 81CD cmpa #$cd | |
84FB 23B5 bls do_sn_error_84B2 ; ?SN ERROR | |
84FD 6E9F012D jmp [$012d] ; must be disk command | |
8501 9D9F L_8501 jsr <$9f ; get next character from BASIC source | |
8503 8198 cmpa #$98 | |
8505 10271603 lbeq LET_MIDstr_handler ; MID$ on LHS | |
8509 819E cmpa #$9e | |
850B 10271842 lbeq LET_TIMER_handler ; TIMER on LHS | |
850F BD01A0 jsr >$01a0 ; PATCH - CLS GET PUT ??? | |
8512 209E bra do_sn_error_84B2 ; ?SN ERROR | |
8514 9E19 RESTORE_dispatch ldx <$19 ; start of BASIC program | |
8516 301F leax -1,x | |
8518 9F33 L_8518 stx <$33 ; READ pointer | |
851A 39 L_851A rts | |
851B BD8006 scan_key jsr POLCAT ; scan keyboard | |
851E 270A beq L_852A | |
8520 8103 L_8520 cmpa #$03 | |
8522 2715 beq STOP_dispatch ; BREAK | |
8524 8113 cmpa #$13 | |
8526 2703 beq wait_key ; SHIFT + @ | |
8528 9787 sta <$87 | |
852A 39 L_852A rts | |
852B BD8006 wait_key jsr POLCAT ; scan keyboard | |
852E 27FB beq wait_key | |
8530 20EE bra L_8520 | |
8532 BDB65C END_dispatch jsr L_B65C ; close cassette stream | |
8535 9DA5 jsr <$a5 ; get current character from BASIC source | |
8537 2002 bra L_853B | |
8539 1A01 STOP_dispatch orcc #$01 ; * STOP | |
853B 2633 L_853B bne L_8570 ; RTS | |
853D 9EA6 ldx <$a6 ; BASIC source pointer | |
853F 9F2F stx <$2f ; address of current BASIC statement | |
8541 0600 L_8541 ror <$00 ; make -ve for STOP | |
8543 3262 leas 2,s ; lose return address | |
8545 9E68 L_8545 ldx <$68 ; current line number | |
8547 8CFFFF cmpx #$ffff | |
854A 2706 beq L_8552 ; already in command mode | |
854C 9F29 stx <$29 ; CONT line number | |
854E 9E2F ldx <$2f ; address of current BASIC statement | |
8550 9F2D stx <$2d ; CONT source address | |
8552 0F6F L_8552 clr <$6f ; DEVN | |
8554 8E82EF ldx #text_break - 1 ; /BREAK/ | |
8557 0D00 tst <$00 | |
8559 102AFE14 lbpl goto_ok_prompt ; command mode | |
855D 7E8366 jmp L_8366 ; print BREAK message | |
8560 260E CONT_dispatch bne L_8570 ; RTS | |
8562 C620 ldb #$20 ; ?CN ERROR | |
8564 9E2D ldx <$2d ; CONT source address | |
8566 1027FDDA lbeq system_error ; cause error | |
856A 9FA6 stx <$a6 ; BASIC source pointer | |
856C 9E29 ldx <$29 ; CONT line number | |
856E 9F68 stx <$68 ; current line number | |
8570 39 L_8570 rts | |
8571 272C CLEAR_dispatch beq L_859F ; clear variables & reset stack | |
8573 BD8B23 jsr L_8B23 ; read unsigned number into $52 & D | |
8576 3406 pshs a,b | |
8578 9E27 ldx <$27 ; top of BASIC RAM | |
857A 9DA5 jsr <$a5 ; get current character from BASIC source | |
857C 270C beq L_858A | |
857E BD89AA jsr CkComa ; skip comma | |
8581 BD8E83 jsr Get16Bit ; read 16 bit number into X | |
8584 301F leax -1,x | |
8586 9C74 cmpx <$74 ; top of RAM | |
8588 2218 bhi do_om_error_85A2 ; ?OM ERROR | |
858A 1F10 L_858A tfr x,d | |
858C A3E1 subd ,s++ | |
858E 2512 bcs do_om_error_85A2 ; ?OM ERROR | |
8590 1F03 tfr d,u | |
8592 83003A subd #$003a | |
8595 250B bcs do_om_error_85A2 ; ?OM ERROR | |
8597 931B subd <$1b ; start of simple variables | |
8599 2507 bcs do_om_error_85A2 ; ?OM ERROR | |
859B DF21 stu <$21 ; new stack address | |
859D 9F27 stx <$27 ; new top of BASIC RAM | |
859F 7E8424 L_859F jmp L_8424 ; clear variables & reset stack | |
85A2 7E8342 do_om_error_85A2 jmp OM_error ; ?OM ERROR | |
85A5 BD0194 RUN_dispatch jsr >$0194 ; PATCH - run | |
85A8 BD98E3 jsr L_98E3 ; set up sound & graphics variables | |
85AB BDB65C jsr L_B65C ; close cassette stream | |
85AE 9DA5 jsr <$a5 ; get current character from BASIC source | |
85B0 1027FE6B lbeq BasVect1 ; clear variables and reset stack & cmd ptr | |
85B4 BD8424 jsr L_8424 ; clear variables & reset stack | |
85B7 2019 bra L_85D2 ; perform GOTO | |
85B9 1F89 GO_dispatch tfr a,b ; * 3,S address of GOSUB statement (points to SUB token) | |
85BB 9D9F L_85BB jsr <$9f ; get next character from BASIC source | |
85BD C1BC cmpb #$bc ; token TO | |
85BF 2716 beq GOTO_handoff ; perform GOTO | |
85C1 C1BD cmpb #$bd ; token SUB | |
85C3 2645 bne do_sn_error_860A ; ?SN ERROR | |
85C5 C603 GOSUB_handoff ldb #$03 | |
85C7 BD8331 jsr L_8331 ; memory check | |
85CA DEA6 ldu <$a6 ; BASIC source pointer | |
85CC 9E68 ldx <$68 ; current line number | |
85CE 86BD lda #$bd ; token SUB | |
85D0 3452 pshs a,x,u | |
85D2 8D03 L_85D2 bsr GOTO_handoff ; perform GOTO | |
85D4 7E849F jmp run_basic ; interpreter loop | |
85D7 9DA5 GOTO_handoff jsr <$a5 ; get current character from BASIC source | |
85D9 BD869A jsr L_869A ; read line number & store in $2b | |
85DC 8D40 bsr L_861E ; find end of line | |
85DE 3001 leax 1,x | |
85E0 DC2B ldd <$2b | |
85E2 109368 cmpd <$68 ; current line number | |
85E5 2202 bhi L_85E9 | |
85E7 9E19 ldx <$19 ; start of BASIC program | |
85E9 BD8403 L_85E9 jsr L_8403 ; scan for line D | |
85EC 2517 bcs UL_error ; ?UL ERROR | |
85EE 301F L_85EE leax -1,x | |
85F0 9FA6 stx <$a6 ; BASIC source pointer | |
85F2 39 L_85F2 rts | |
85F3 26FD RETURN_dispatch bne L_85F2 ; RTS | |
85F5 86FF lda #$ff | |
85F7 973B sta <$3b ; set $3b to skip all FOR entries | |
85F9 BD82F7 jsr L_82F7 ; examine BASIC stack | |
85FC 1F14 tfr x,s ; point stack to this entry | |
85FE 813D cmpa #$3d | |
8600 270B beq L_860D ; GOSUB signature (#$BD - #$80) | |
8602 C604 RG_error ldb #$04 ; ?RG ERROR | |
8604 8C fcb $8c ; cmpx #$c60e - comment byte | |
8605 C60E UL_error ldb #$0e ; usually skipped by comment byte | |
8607 7E8344 jmp system_error ; cause error | |
860A 7E89B4 do_sn_error_860A jmp SN_error ; ?SN ERROR | |
860D 3552 L_860D puls a,x,u | |
860F 9F68 stx <$68 ; current line number | |
8611 DFA6 stu <$a6 ; BASIC source pointer | |
8613 8D06 DATA_dispatch bsr L_861B ; find end of statement | |
8615 8C fcb $8c ; cmpx #$8d06 - comment byte | |
8616 8D06 REM_ELSE_dispatch bsr L_861E ; usually skipped by comment byte | |
8618 9FA6 stx <$a6 ; BASIC source pointer | |
861A 39 L_861A rts | |
861B C63A L_861B ldb #$3a ; * find end of statement | |
861D 86 fcb $86 ; lda #$5f - comment byte | |
861E 5F L_861E clrb ; usually skipped by comment byte | |
861F D701 stb <$01 ; * (861E 5F CLRB) | |
8621 5F clrb | |
8622 9EA6 ldx <$a6 ; BASIC source pointer | |
8624 1F98 L_8624 tfr b,a | |
8626 D601 ldb <$01 | |
8628 9701 sta <$01 | |
862A A684 L_862A lda ,x | |
862C 27EC beq L_861A ; RTS | |
862E 3404 pshs b | |
8630 A1E0 cmpa ,s+ | |
8632 27E6 beq L_861A ; RTS | |
8634 3001 leax 1,x | |
8636 8122 cmpa #$22 | |
8638 27EA beq L_8624 | |
863A 4C inca | |
863B 2602 bne L_863F | |
863D 3001 leax 1,x | |
863F 8186 L_863F cmpa #$86 ; token IF (+1) | |
8641 26E7 bne L_862A | |
8643 0C04 inc <$04 ; increment for each IF token encountered | |
8645 20E3 bra L_862A | |
8647 BD8872 IF_dispatch jsr L_8872 ; read numeric expression into FPA1 | |
864A 9DA5 jsr <$a5 ; get current character from BASIC source | |
864C 8181 cmpa #$81 ; token GO | |
864E 2705 beq L_8655 | |
8650 C6BF ldb #$bf ; token THEN | |
8652 BD89AC jsr CkChar ; skip character in B | |
8655 964F L_8655 lda <$4f | |
8657 2613 bne L_866C ; IF condition true | |
8659 0F04 clr <$04 ; clear IF counter | |
865B 8DB6 L_865B bsr DATA_dispatch ; skip to start of next statement | |
865D 4D tsta | |
865E 27BA beq L_861A ; RTS | |
8660 9D9F jsr <$9f ; get next character from BASIC source | |
8662 8184 cmpa #$84 ; token ELSE | |
8664 26F5 bne L_865B ; we're looking for ELSE | |
8666 0A04 dec <$04 ; any IFs skipped? | |
8668 2AF1 bpl L_865B ; this ELSE doesn't go with this IF | |
866A 9D9F jsr <$9f ; get next character from BASIC source | |
866C 9DA5 L_866C jsr <$a5 ; get current character from BASIC source | |
866E 1025FF65 lbcs GOTO_handoff ; it's a number - perform GOTO | |
8672 7E84DC jmp L_84DC ; interpret statement | |
8675 BD8E51 ON_dispatch jsr Get8Bit ; get number into B | |
8678 C681 ldb #$81 ; token GO | |
867A BD89AC jsr CkChar ; skip character in B | |
867D 3402 pshs a | |
867F 81BD cmpa #$bd ; token SUB | |
8681 2704 beq L_8687 | |
8683 81BC cmpa #$bc ; token TO | |
8685 2683 L_8685 bne do_sn_error_860A ; ?SN ERROR | |
8687 0A53 L_8687 dec <$53 ; control variable | |
8689 2605 bne L_8690 | |
868B 3504 puls b | |
868D 7E85BB jmp L_85BB ; GO (cmd pointer now at desired choice) | |
8690 9D9F L_8690 jsr <$9f ; get next character from BASIC source | |
8692 8D06 bsr L_869A ; read line number & store in $2b | |
8694 812C cmpa #$2c | |
8696 27EF beq L_8687 | |
8698 3584 puls b,pc | |
869A 9E8A L_869A ldx <$8a ; zero | |
869C 9F2B stx <$2b | |
869E 2464 L_869E bcc L_8704 ; not a digit - RTS | |
86A0 8030 suba #$30 | |
86A2 9701 sta <$01 | |
86A4 DC2B ldd <$2b | |
86A6 8118 cmpa #$18 ; D > 6399? | |
86A8 22DB bhi L_8685 ; ?SN ERROR | |
86AA 58 lslb | |
86AB 49 rola | |
86AC 58 lslb ; D = D * 10 | |
86AD 49 rola | |
86AE D32B addd <$2b | |
86B0 58 lslb | |
86B1 49 rola | |
86B2 DB01 addb <$01 ; add new digit | |
86B4 8900 adca #$00 | |
86B6 DD2B std <$2b | |
86B8 9D9F jsr <$9f ; get next character from BASIC source | |
86BA 20E2 bra L_869E ; process another digit | |
86BC BD8A94 LET_dispatch jsr GETVAR ; get varptr of variable in X | |
86BF 9F3B stx <$3b | |
86C1 C6CB ldb #$cb ; token = | |
86C3 BD89AC jsr CkChar ; skip character in B | |
86C6 9606 lda <$06 ; numeric / string flag | |
86C8 3402 pshs a | |
86CA BD8887 jsr get_string ; get expression | |
86CD 3502 puls a | |
86CF 46 rora ; check that variable & expression | |
86D0 BD8879 jsr L_8879 ; are of same type | |
86D3 10270D07 lbeq L_93DE ; assign FPA1 to varptr in <$3b | |
86D7 BD019D L_86D7 jsr >$019d ; PATCH - assign string variable | |
86DA 9E52 ldx <$52 | |
86DC DC21 ldd <$21 ; stack root / string storage start | |
86DE 10A302 cmpd 2,x | |
86E1 2411 bcc L_86F4 | |
86E3 9C1B cmpx <$1b ; start of simple variables | |
86E5 250D bcs L_86F4 | |
86E7 E684 ldb ,x | |
86E9 BD8C50 jsr L_8C50 ; reserve B bytes of string space | |
86EC 9E4D ldx <$4d | |
86EE BD8D89 jsr L_8D89 ; copy string (len B) from varptr X to ($25)+ | |
86F1 8E0056 ldx #$0056 | |
86F4 9F4D L_86F4 stx <$4d | |
86F6 BD8DBB jsr L_8DBB ; if X is top of string stack then pull it | |
86F9 DE4D ldu <$4d | |
86FB 9E3B ldx <$3b | |
86FD 3726 pulu a,b,y | |
86FF A784 sta ,x | |
8701 10AF02 sty 2,x | |
8704 39 L_8704 rts | |
8705 3F5245444F0D text_redo fcc /?REDO/,$0d ; /?REDO/CR | |
870B 00 fcc $00 | |
870C C624 L_870C ldb #$24 ; ?FD ERROR | |
870E 0D6F tst <$6f ; DEVN | |
8710 2703 beq L_8715 | |
8712 7E8344 L_8712 jmp system_error ; cause error | |
8715 9609 L_8715 lda <$09 | |
8717 2707 beq redo_input | |
8719 9E31 ldx <$31 ; line number of current DATA statement | |
871B 9F68 stx <$68 ; current line number | |
871D 7E89B4 jmp SN_error ; ?SN ERROR | |
8720 8E8704 redo_input ldx #L_8704 ; /?REDO/ | |
8723 BD90E5 jsr out_string ; print string to DEVN | |
8726 9E2F ldx <$2f ; address of current BASIC statement | |
8728 9FA6 stx <$a6 ; BASIC source pointer | |
872A 39 rts | |
872B BD9C76 INPUT_dispatch jsr ensure_not_direct ; test for command mode | |
872E 8D03 bsr L_8733 | |
8730 0F6F clr <$6f ; DEVN | |
8732 39 rts | |
8733 8123 L_8733 cmpa #$23 | |
8735 2609 bne L_8740 | |
8737 BDB7D7 jsr L_B7D7 ; read #-n & set up DEVN | |
873A BDB623 jsr L_B623 ; test cassette status OK for input | |
873D BD89AA jsr CkComa ; skip comma | |
8740 8122 L_8740 cmpa #$22 | |
8742 260B bne L_874F ; no prompt | |
8744 BD8975 jsr L_8975 ; read literal string | |
8747 C63B ldb #$3b | |
8749 BD89AC jsr CkChar ; skip character in B | |
874C BD90E8 jsr L_90E8 ; print prompt | |
874F 8E02DC L_874F ldx #$02dc | |
8752 6F84 clr ,x | |
8754 0D6F tst <$6f ; DEVN | |
8756 2622 bne L_877A | |
8758 8D06 bsr L_8760 ; get something into input buffer | |
875A C62C ldb #$2c | |
875C E784 stb ,x | |
875E 201A bra L_877A ; read input into variables | |
8760 BD90F8 L_8760 jsr L_90F8 ; print '?' to DEVN | |
8763 BD90F5 jsr L_90F5 ; print a space to DEVN | |
8766 BDB5C6 L_8766 jsr L_B5C6 ; line input from DEVN | |
8769 2405 bcc L_8770 | |
876B 3264 leas 4,s | |
876D 7E8541 jmp L_8541 ; BREAK | |
8770 C630 L_8770 ldb #$30 ; ?IE ERROR | |
8772 0D70 tst <$70 ; eof flag | |
8774 269C bne L_8712 | |
8776 39 rts | |
8777 9E33 READ_dispatch ldx <$33 ; READ pointer | |
8779 86 fcb $86 ; lda #$4f - comment byte | |
877A 4F L_877A clra ; usually skipped by comment byte | |
877B 9709 sta <$09 | |
877D 9F35 stx <$35 | |
877F BD8A94 L_877F jsr GETVAR ; get varptr of variable in X | |
8782 9F3B stx <$3b | |
8784 9EA6 ldx <$a6 ; BASIC source pointer | |
8786 9F2B stx <$2b | |
8788 9E35 ldx <$35 | |
878A A684 lda ,x | |
878C 260C bne L_879A | |
878E 9609 lda <$09 | |
8790 2658 bne L_87EA | |
8792 BD017C jsr >$017c ; PATCH - re-request input | |
8795 BD90F8 jsr L_90F8 ; print '?' to DEVN | |
8798 8DC6 bsr L_8760 | |
879A 9FA6 L_879A stx <$a6 ; BASIC source pointer | |
879C 9D9F jsr <$9f ; get next character from BASIC source | |
879E D606 ldb <$06 ; numeric / string flag | |
87A0 2727 beq L_87C9 | |
87A2 9EA6 ldx <$a6 ; BASIC source pointer | |
87A4 9701 sta <$01 | |
87A6 8122 cmpa #$22 | |
87A8 2712 beq L_87BC | |
87AA 301F leax -1,x | |
87AC 4F clra | |
87AD 9701 sta <$01 | |
87AF BDB595 jsr L_B595 ; initialise virtual DEVN device | |
87B2 0D6E tst <$6e ; cassette IO flag | |
87B4 2606 bne L_87BC ; IO in progress | |
87B6 863A lda #$3a | |
87B8 9701 sta <$01 | |
87BA 862C lda #$2c | |
87BC 9702 L_87BC sta <$02 | |
87BE BD8C61 jsr L_8C61 ; compile literal string at X | |
87C1 BD897A jsr L_897A | |
87C4 BD86D7 jsr L_86D7 ; assign string variable | |
87C7 2006 bra L_87CF | |
87C9 BD94BD L_87C9 jsr L_94BD ; read numeric constant into FPA1 | |
87CC BD93DE jsr L_93DE ; assign FPA1 to varptr in <$3b | |
87CF 9DA5 L_87CF jsr <$a5 ; get current character from BASIC source | |
87D1 2706 beq L_87D9 | |
87D3 812C cmpa #$2c | |
87D5 1026FF33 lbne L_870C ; take action for illegal input | |
87D9 9EA6 L_87D9 ldx <$a6 ; BASIC source pointer | |
87DB 9F35 stx <$35 | |
87DD 9E2B ldx <$2b | |
87DF 9FA6 stx <$a6 ; BASIC source pointer | |
87E1 9DA5 jsr <$a5 ; get current character from BASIC source | |
87E3 2721 beq L_8806 | |
87E5 BD89AA jsr CkComa ; skip comma | |
87E8 2095 bra L_877F | |
87EA 9FA6 L_87EA stx <$a6 ; BASIC source pointer | |
87EC BD861B jsr L_861B ; find end of statement | |
87EF 3001 leax 1,x | |
87F1 4D tsta | |
87F2 260A bne L_87FE | |
87F4 C606 ldb #$06 | |
87F6 EE81 ldu ,x++ | |
87F8 2741 beq L_883B | |
87FA EC81 ldd ,x++ | |
87FC DD31 std <$31 ; line number of current DATA statement | |
87FE A684 L_87FE lda ,x | |
8800 8186 cmpa #$86 | |
8802 26E6 bne L_87EA | |
8804 2094 bra L_879A | |
8806 9E35 L_8806 ldx <$35 | |
8808 D609 ldb <$09 | |
880A 1026FD0A lbne L_8518 | |
880E A684 lda ,x | |
8810 2706 beq L_8818 | |
8812 8E8818 ldx #L_8818 | |
8815 7E90E5 jmp out_string ; print string to DEVN | |
8818 39 L_8818 rts | |
8819 3F45585452412049474E4F5245440D text_extra_ignored fcc /?EXTRA IGNORED/,$0d ; /?EXTRA IGNORED/CR | |
8828 00 fcc $00 | |
8829 2604 NEXT_dispatch bne L_882F ; control variable specified | |
882B 9E8A ldx <$8a ; zero | |
882D 2003 bra L_8832 | |
882F BD8A94 L_882F jsr GETVAR ; get varptr of variable in X | |
8832 9F3B L_8832 stx <$3b | |
8834 BD82F7 jsr L_82F7 ; examine BASIC stack | |
8837 2704 beq L_883D ; found match | |
8839 C600 ldb #$00 ; ?NF ERROR | |
883B 2047 L_883B bra L_8884 | |
883D 1F14 L_883D tfr x,s ; point stack to this entry | |
883F 3003 leax 3,x ; point X to STEP value | |
8841 BD93BF jsr MOVFM ; load variable into FPA1 (X is varptr) | |
8844 A668 lda 8,s ; sign of STEP value | |
8846 9754 sta <$54 | |
8848 9E3B ldx <$3b ; varptr of control variable | |
884A BD910B jsr L_910B ; add varptr X to FPA1 | |
884D BD93DE jsr L_93DE ; assign FPA1 to varptr in <$3b | |
8850 3069 leax 9,s ; point X to terminating value | |
8852 BD9441 jsr L_9441 ; compare FPA1 - varptr X | |
8855 E068 subb 8,s ; test depends on step direction | |
8857 270C beq L_8865 ; terminating condition met | |
8859 AE6E ldx 14,s | |
885B 9F68 stx <$68 ; current line number | |
885D AEE810 ldx <$10,s | |
8860 9FA6 stx <$a6 ; BASIC source pointer | |
8862 7E849F L_8862 jmp run_basic ; interpreter loop | |
8865 32E812 L_8865 leas <$12,s ; finished with this entry | |
8868 9DA5 jsr <$a5 ; get current character from BASIC source | |
886A 812C cmpa #$2c | |
886C 26F4 bne L_8862 ; no more variables after NEXT | |
886E 9D9F jsr <$9f ; get next character from BASIC source | |
8870 8DBD bsr L_882F ; BSR used for correct stack structure | |
8872 8D13 L_8872 bsr get_string ; get expression | |
8874 1CFE L_8874 andcc #$fe ; * cause error if expression last evaluated not numeric | |
8876 7D fcb $7d ; tst >$1a01 - comment byte | |
8877 1A01 get_expr orcc #$01 ; usually skipped by comment byte | |
8879 0D06 L_8879 tst <$06 ; numeric / string flag | |
887B 2503 bcs L_8880 | |
887D 2A99 bpl L_8818 ; RTS | |
887F 8C fcb $8c ; cmpx #$2b96 - comment byte | |
8880 2B96 L_8880 bmi L_8818 ; usually skipped by comment byte | |
8882 C618 TM_error ldb #$18 ; ?TM ERROR | |
8884 7E8344 L_8884 jmp system_error ; cause error | |
8887 8D6E get_string bsr L_88F7 ; move source pointer back one | |
8889 4F L_8889 clra | |
888A 8C fcb $8c ; cmpx #$3404 - comment byte | |
888B 3404 L_888B pshs b ; usually skipped by comment byte | |
888D 3402 pshs a ; * (888B 3404 PSHS B) | |
888F C601 ldb #$01 | |
8891 BD8331 jsr L_8331 ; memory check | |
8894 BD8954 jsr L_8954 ; evaluate sub-expression | |
8897 0F3F clr <$3f ; flag used for relational operators | |
8899 9DA5 L_8899 jsr <$a5 ; get current character from BASIC source | |
889B 80CA L_889B suba #$ca ; branch to $88B2 if token is not in the set | |
889D 2513 bcs L_88B2 ; [ >, =, < ] | |
889F 8103 cmpa #$03 | |
88A1 240F bcc L_88B2 | |
88A3 8101 cmpa #$01 ; map [0, 1, 2] to [1, 2, 4] | |
88A5 49 rola | |
88A6 983F eora <$3f ; determine valid combination of > = < | |
88A8 913F cmpa <$3f | |
88AA 2564 bcs do_sn_error_8910 ; ?SN ERROR | |
88AC 973F sta <$3f | |
88AE 9D9F jsr <$9f ; get next character from BASIC source | |
88B0 20E9 bra L_889B | |
88B2 D63F L_88B2 ldb <$3f ; $3f = [ 1, 2, 3, 4, 5, 6 ] | |
88B4 2633 bne L_88E9 ; for [ > = >= < <> <= ] | |
88B6 1024006B lbcc L_8925 | |
88BA 8B07 adda #$07 | |
88BC 2467 bcc L_8925 ; not a binary operator | |
88BE 9906 adca <$06 ; A = A + 1 + ($06) | |
88C0 10270491 lbeq L_8D55 ; '+' in a string expression | |
88C4 89FF adca #$ff ; A = A - 1 if numeric expression | |
88C6 3402 pshs a | |
88C8 48 lsla | |
88C9 ABE0 adda ,s+ ; A = A * 3 | |
88CB 8E8294 ldx #operator_dispatch ; binary operator precedence table | |
88CE 3086 leax a,x | |
88D0 3502 L_88D0 puls a ; precedence of last operator | |
88D2 A184 cmpa ,x | |
88D4 2455 bcc L_892B ; new op. has a lower precedence | |
88D6 8D9C bsr L_8874 ; validate numeric expression | |
88D8 3402 L_88D8 pshs a | |
88DA 8D29 bsr L_8905 ; push op handler & FPA1 / get expression | |
88DC 9E3D ldx <$3d | |
88DE 3502 puls a | |
88E0 261D bne L_88FF | |
88E2 4D tsta | |
88E3 1027006A lbeq L_8951 ; LDB <$4F RTS | |
88E7 204B bra L_8934 | |
88E9 0806 L_88E9 lsl <$06 ; numeric / string flag | |
88EB 59 rolb | |
88EC 8D09 bsr L_88F7 ; move source pointer back one | |
88EE 8E88FC ldx #data_88FC | |
88F1 D73F stb <$3f | |
88F3 0F06 clr <$06 ; numeric / string flag | |
88F5 20D9 bra L_88D0 | |
88F7 9EA6 L_88F7 ldx <$a6 ; BASIC source pointer | |
88F9 7E85EE jmp L_85EE ; subtract 1 from X & store in $a6 | |
88FC 64 data_88FC fcb $64 ; * rel. op. precedence & handler | |
88FD 8A31 fdb jmp_8A31 | |
88FF A184 L_88FF cmpa ,x | |
8901 2431 bcc L_8934 | |
8903 20D3 bra L_88D8 | |
8905 EC01 L_8905 ldd 1,x ; op handler | |
8907 3406 pshs a,b | |
8909 8D08 bsr L_8913 ; push FPA1 onto stack | |
890B D63F ldb <$3f ; rel. op. flag | |
890D 16FF7B lbra L_888B ; get expression | |
8910 7E89B4 do_sn_error_8910 jmp SN_error ; ?SN ERROR | |
8913 D654 L_8913 ldb <$54 ; * push FPA1 onto stack | |
8915 A684 lda ,x | |
8917 3520 L_8917 puls y | |
8919 3404 pshs b | |
891B D64F L_891B ldb <$4f | |
891D 9E50 ldx <$50 | |
891F DE52 ldu <$52 | |
8921 3454 pshs b,x,u | |
8923 6EA4 jmp ,y | |
8925 9E8A L_8925 ldx <$8a ; zero | |
8927 A6E0 lda ,s+ | |
8929 2726 beq L_8951 ; LDB <$4F RTS | |
892B 8164 L_892B cmpa #$64 | |
892D 2703 beq L_8932 | |
892F BD8874 jsr L_8874 ; validate numeric expression | |
8932 9F3D L_8932 stx <$3d | |
8934 3504 L_8934 puls b | |
8936 815A cmpa #$5a | |
8938 2719 beq L_8953 ; RTS | |
893A 817D cmpa #$7d | |
893C 2715 beq L_8953 ; RTS | |
893E 54 lsrb ; sets carry if rel. op. was for string | |
893F D70A stb <$0a | |
8941 3552 puls a,x,u ; pull FPA2 off stack | |
8943 975C sta <$5c ; set $62 up with sign difference | |
8945 9F5D stx <$5d | |
8947 DF5F stu <$5f ; LDB <$4F | |
8949 3504 puls b | |
894B D761 stb <$61 ; RTS calls operator handler | |
894D D854 eorb <$54 ; (with carry from above) | |
894F D762 stb <$62 | |
8951 D64F L_8951 ldb <$4f | |
8953 39 L_8953 rts | |
8954 BD018B L_8954 jsr >$018b ; PATCH - evaluate expression | |
8957 0F06 clr <$06 ; numeric / string flag | |
8959 9D9F jsr <$9f ; get next character from BASIC source | |
895B 2403 bcc L_8960 | |
895D 7E94BD L_895D jmp L_94BD ; read numeric constant into FPA1 | |
8960 BD8ADF L_8960 jsr L_8ADF ; carry clear if A-Z | |
8963 245C bcc L_89C1 ; evaluate variable | |
8965 812E cmpa #$2e | |
8967 27F4 beq L_895D | |
8969 81C4 cmpa #$c4 ; token - | |
896B 274C beq L_89B9 ; read expression & negate | |
896D 81C3 cmpa #$c3 ; token + | |
896F 27E3 beq L_8954 ; ignore + | |
8971 8122 cmpa #$22 | |
8973 260A bne L_897F | |
8975 9EA6 L_8975 ldx <$a6 ; BASIC source pointer | |
8977 BD8C5B jsr L_8C5B ; compile literal string at X | |
897A 9E64 L_897A ldx <$64 | |
897C 9FA6 stx <$a6 ; move source pointer to end of string | |
897E 39 rts | |
897F 81C0 L_897F cmpa #$c0 ; token NOT | |
8981 260D bne L_8990 | |
8983 865A lda #$5a | |
8985 BD888B jsr L_888B | |
8988 BD8B2D jsr INTCNV ; read signed number from FPA1 to $52 & D | |
898B 43 coma | |
898C 53 comb | |
898D 7E8C37 jmp GIVABF ; assign D to FPA1 | |
8990 81BE L_8990 cmpa #$be ; token FN | |
8992 1027132E lbeq L_9CC4 | |
8996 8126 cmpa #$26 | |
8998 1027127F lbeq L_9C1B ; read octal or hex number into $52 / $53 | |
899C 4C inca | |
899D 272E beq L_89CD ; evaluate function | |
899F 8D06 L_899F bsr CkOpBrak ; skip open bracket (only legal chr. left) | |
89A1 BD8887 jsr get_string ; get expression | |
89A4 C629 CkClBrak ldb #$29 ; * check for close bracket | |
89A6 8C fcb $8c ; cmpx #$c628 - comment byte | |
89A7 C628 CkOpBrak ldb #$28 ; usually skipped by comment byte | |
89A9 8C fcb $8c ; * (89A7 C628 LDB #$28) / cmpx #$c62c - comment byte | |
89AA C62C CkComa ldb #$2c ; usually skipped by comment byte | |
89AC E19F00A6 CkChar cmpb [$00a6] ; * check for character in B | |
89B0 2602 bne SN_error ; ?SN ERROR | |
89B2 0E9F jmp <$9f ; get next character from BASIC source | |
89B4 C602 SN_error ldb #$02 ; ?SN ERROR | |
89B6 7E8344 jmp system_error ; cause error | |
89B9 867D L_89B9 lda #$7d ; * read expression & negate FPA1 | |
89BB BD888B jsr L_888B | |
89BE 7E96DE jmp L_96DE ; COM $54 if FPA1 non zero | |
89C1 BD8A94 L_89C1 jsr GETVAR ; get varptr of variable in X | |
89C4 9F52 called_from_89C4 stx <$52 | |
89C6 9606 lda <$06 ; numeric / string flag | |
89C8 2689 bne L_8953 ; RTS (string) | |
89CA 7E93BF jmp MOVFM ; load variable into FPA1 (X is varptr) | |
89CD 9D9F L_89CD jsr <$9f ; get next character from BASIC source | |
89CF 1F89 tfr a,b | |
89D1 58 lslb | |
89D2 9D9F jsr <$9f ; get next character from BASIC source | |
89D4 C142 cmpb #$42 | |
89D6 2304 bls L_89DC | |
89D8 6E9F0132 jmp [$0132] ; disk function despatch | |
89DC 3404 L_89DC pshs b | |
89DE C12C cmpb #$2c | |
89E0 2522 bcs L_8A04 ; functions with single arguments | |
89E2 C134 cmpb #$34 | |
89E4 2420 bcc L_8A06 ; functions with special or no arguments | |
89E6 8DBF bsr CkOpBrak ; skip open bracket | |
89E8 A6E4 lda ,s | |
89EA 8132 cmpa #$32 | |
89EC 2418 bcc L_8A06 ; not LEFT$, RIGHT$ or MID$ | |
89EE BD8887 jsr get_string ; get expression | |
89F1 8DB7 bsr CkComa ; skip comma | |
89F3 BD8877 jsr get_expr ; validate string | |
89F6 3502 puls a | |
89F8 DE52 ldu <$52 | |
89FA 3442 pshs a,u | |
89FC BD8E51 jsr Get8Bit ; get number into B | |
89FF 3502 puls a | |
8A01 3406 pshs a,b | |
8A03 8E fcb $8e ; ldx #$8d99 - comment byte | |
8A04 8D99 L_8A04 bsr L_899F ; usually skipped by comment byte | |
8A06 3504 L_8A06 puls b ; * (8A04 8D99 BSR $899F) ;get expression inside brackets | |
8A08 BE0128 ldx >$0128 ; function despatch table | |
8A0B 3A abx | |
8A0C AD94 jsr [,x] | |
8A0E 7E8874 jmp L_8874 ; validate numeric expression | |
8A11 86 OR_dispatch fcb $86 ; * OR / lda #$4f - comment byte | |
8A12 4F AND_dispatch clra ; usually skipped by comment byte | |
8A13 9703 sta <$03 ; * (8A12 4F CLRA) | |
8A15 BD8B2D jsr INTCNV ; read signed number from FPA1 to $52 & D | |
8A18 DD01 std <$01 | |
8A1A BD93F5 jsr L_93F5 ; copy FPA2 to FPA1 | |
8A1D BD8B2D jsr INTCNV ; read signed number from FPA1 to $52 & D | |
8A20 0D03 tst <$03 | |
8A22 2606 bne L_8A2A | |
8A24 9401 anda <$01 | |
8A26 D402 andb <$02 | |
8A28 2004 bra L_8A2E | |
8A2A 9A01 L_8A2A ora <$01 | |
8A2C DA02 orb <$02 | |
8A2E 7E8C37 L_8A2E jmp GIVABF ; assign D to FPA1 | |
8A31 BD8879 jmp_8A31 jsr L_8879 ; validate string / numeric using carry | |
8A34 2610 bne L_8A46 ; valid string | |
8A36 9661 lda <$61 | |
8A38 8A7F ora #$7f | |
8A3A 945D anda <$5d | |
8A3C 975D sta <$5d | |
8A3E 8E005C ldx #$005c ; FPA2 | |
8A41 BD9441 jsr L_9441 ; compare FPA1 - varptr X | |
8A44 2036 bra L_8A7C | |
8A46 0F06 L_8A46 clr <$06 ; numeric / string flag | |
8A48 0A3F dec <$3f | |
8A4A BD8D9D jsr L_8D9D ; point X to string just compiled & len in B | |
8A4D D756 stb <$56 | |
8A4F 9F58 stx <$58 | |
8A51 9E5F ldx <$5f | |
8A53 BD8D9F jsr DELVAR ; point X to string & length in B | |
8A56 9656 lda <$56 | |
8A58 3404 pshs b | |
8A5A A0E0 suba ,s+ | |
8A5C 2707 beq L_8A65 | |
8A5E 8601 lda #$01 | |
8A60 2403 bcc L_8A65 | |
8A62 D656 ldb <$56 | |
8A64 40 nega | |
8A65 9754 L_8A65 sta <$54 | |
8A67 DE58 ldu <$58 | |
8A69 5C incb | |
8A6A 5A L_8A6A decb | |
8A6B 2604 bne L_8A71 | |
8A6D D654 ldb <$54 | |
8A6F 200B bra L_8A7C | |
8A71 A680 L_8A71 lda ,x+ | |
8A73 A1C0 cmpa ,u+ | |
8A75 27F3 beq L_8A6A | |
8A77 C6FF ldb #$ff | |
8A79 2401 bcc L_8A7C | |
8A7B 50 negb | |
8A7C CB01 L_8A7C addb #$01 ; map [-1, 0, 1] to [1, 2, 4] | |
8A7E 59 rolb | |
8A7F D40A andb <$0a ; rel. op. number | |
8A81 2702 beq L_8A85 | |
8A83 C6FF ldb #$ff | |
8A85 7E9427 L_8A85 jmp L_9427 ; assign B to FPA1 (result of relation) | |
8A88 BD89AA L_8A88 jsr CkComa ; skip comma | |
8A8B C601 DIM_dispatch ldb #$01 ; * DIM | |
8A8D 8D08 bsr L_8A97 ; create variable | |
8A8F 9DA5 jsr <$a5 ; get current character from BASIC source | |
8A91 26F5 bne L_8A88 ; skip comma & read next array | |
8A93 39 rts | |
8A94 5F GETVAR clrb ; * returns $39 = X = varptr address | |
8A95 9DA5 jsr <$a5 ; get current character from BASIC source | |
8A97 D705 L_8A97 stb <$05 ; * set B to cause error if array variable already exists | |
8A99 9737 L_8A99 sta <$37 | |
8A9B 9DA5 jsr <$a5 ; get current character from BASIC source | |
8A9D 8D40 bsr L_8ADF ; carry clear if A-Z | |
8A9F 1025FF11 lbcs SN_error ; ?SN ERROR | |
8AA3 5F clrb | |
8AA4 D706 stb <$06 ; numeric / string flag | |
8AA6 9D9F jsr <$9f ; get next character from BASIC source | |
8AA8 2504 bcs L_8AAE | |
8AAA 8D33 bsr L_8ADF ; carry clear if A-Z | |
8AAC 250A bcs L_8AB8 | |
8AAE 1F89 L_8AAE tfr a,b | |
8AB0 9D9F L_8AB0 jsr <$9f ; get next character from BASIC source | |
8AB2 25FC bcs L_8AB0 | |
8AB4 8D29 bsr L_8ADF ; carry clear if A-Z | |
8AB6 24F8 bcc L_8AB0 | |
8AB8 8124 L_8AB8 cmpa #$24 | |
8ABA 2606 bne L_8AC2 ; numeric variable | |
8ABC 0306 com <$06 ; numeric / string flag | |
8ABE CB80 addb #$80 | |
8AC0 9D9F jsr <$9f ; get next character from BASIC source | |
8AC2 D738 L_8AC2 stb <$38 | |
8AC4 9A08 ora <$08 ; set $08 to #$80 to exclude array variables | |
8AC6 8028 suba #$28 | |
8AC8 10270078 lbeq L_8B44 ; array variable | |
8ACC 0F08 clr <$08 | |
8ACE 9E1B ldx <$1b ; start of simple variables | |
8AD0 DC37 ldd <$37 | |
8AD2 9C1D L_8AD2 cmpx <$1d ; start of array variables | |
8AD4 2712 beq L_8AE8 ; not found - create variable | |
8AD6 10A381 cmpd ,x++ | |
8AD9 273E beq L_8B19 ; found existing variable - STX <$39 & RTS | |
8ADB 3005 leax 5,x | |
8ADD 20F3 bra L_8AD2 ; keep looking | |
8ADF 8141 L_8ADF cmpa #$41 ; * clear carry if A contains 'A'-'Z' | |
8AE1 2504 bcs L_8AE7 | |
8AE3 805B suba #$5b | |
8AE5 80A5 suba #$a5 | |
8AE7 39 L_8AE7 rts | |
8AE8 8E008A L_8AE8 ldx #$008a ; * create variable | |
8AEB EEE4 ldu ,s | |
8AED 118389C4 cmpu #called_from_89C4 ; if called by evaluate variable routine - RTS | |
8AF1 2728 beq L_8B1B ; (with X pointing to zero) | |
8AF3 DC1F ldd <$1f ; end of BASIC storage | |
8AF5 DD43 std <$43 | |
8AF7 C30007 addd #$0007 | |
8AFA DD41 std <$41 | |
8AFC 9E1D ldx <$1d ; start of array variables | |
8AFE 9F47 stx <$47 | |
8B00 BD831C jsr L_831C ; move memory contents up | |
8B03 9E41 ldx <$41 | |
8B05 9F1F stx <$1f ; end of BASIC storage | |
8B07 9E45 ldx <$45 | |
8B09 9F1D stx <$1d ; start of array variables | |
8B0B 9E47 ldx <$47 | |
8B0D DC37 ldd <$37 ; variable name | |
8B0F ED81 std ,x++ | |
8B11 4F clra | |
8B12 5F clrb | |
8B13 ED84 std ,x | |
8B15 ED02 std 2,x | |
8B17 A704 sta 4,x | |
8B19 9F39 L_8B19 stx <$39 | |
8B1B 39 L_8B1B rts | |
8B1C 9080000000 data_8B1C fcb $90,$80,$00,$00,$00 ; FP constant -32768 | |
8B21 9D9F L_8B21 jsr <$9f ; get next character from BASIC source | |
8B23 BD8872 L_8B23 jsr L_8872 ; read numeric expression into FPA1 | |
8B26 BD8874 L_8B26 jsr L_8874 ; validate numeric expression | |
8B29 9654 GETUSR lda <$54 ; * read +ve number from FPA1 into $52 & D | |
8B2B 2B60 bmi FC_error ; ?FC ERROR | |
8B2D BD8874 INTCNV jsr L_8874 ; validate numeric expression | |
8B30 964F lda <$4f | |
8B32 8190 cmpa #$90 | |
8B34 2508 bcs L_8B3E | |
8B36 8E8B1C ldx #data_8B1C ; only 16 bit number allowed is -32768 | |
8B39 BD9441 jsr L_9441 ; compare FPA1 - varptr X | |
8B3C 264F bne FC_error ; ?FC ERROR | |
8B3E BD9473 L_8B3E jsr L_9473 ; denormalize FPA1 to an integer | |
8B41 DC52 ldd <$52 | |
8B43 39 rts | |
8B44 D605 L_8B44 ldb <$05 ; * get varptr of variable continued (handle arrays) | |
8B46 9606 lda <$06 ; numeric / string flag | |
8B48 3406 pshs a,b | |
8B4A 5F clrb | |
8B4B 9E37 L_8B4B ldx <$37 | |
8B4D 3414 pshs b,x | |
8B4F 8DD0 bsr L_8B21 ; read unsigned number into $52 & D | |
8B51 3534 puls b,x,y | |
8B53 9F37 stx <$37 | |
8B55 DE52 ldu <$52 | |
8B57 3460 pshs y,u | |
8B59 5C incb | |
8B5A 9DA5 jsr <$a5 ; get current character from BASIC source | |
8B5C 812C cmpa #$2c | |
8B5E 27EB beq L_8B4B ; get next dimension | |
8B60 D703 stb <$03 ; number of dimensions | |
8B62 BD89A4 jsr CkClBrak ; skip close bracket | |
8B65 3506 puls a,b | |
8B67 9706 sta <$06 ; numeric / string flag | |
8B69 D705 stb <$05 | |
8B6B 9E1D ldx <$1d ; start of array variables | |
8B6D 9C1F L_8B6D cmpx <$1f ; end of BASIC storage | |
8B6F 2721 beq L_8B92 ; not found - create new array | |
8B71 DC37 ldd <$37 | |
8B73 10A384 cmpd ,x | |
8B76 2706 beq L_8B7E ; found array name | |
8B78 EC02 ldd 2,x | |
8B7A 308B leax d,x | |
8B7C 20EF bra L_8B6D ; keep looking | |
8B7E C612 L_8B7E ldb #$12 ; ?DD ERROR | |
8B80 9605 lda <$05 | |
8B82 260B bne L_8B8F ; cause error if array exists & $05 set | |
8B84 D603 ldb <$03 | |
8B86 E104 cmpb 4,x | |
8B88 2759 beq L_8BE3 ; correct number of dimensions | |
8B8A C610 BS_error ldb #$10 ; ?BS ERROR | |
8B8C 8C fcb $8c ; cmpx #$c608 - comment byte | |
8B8D C608 FC_error ldb #$08 ; usually skipped by comment byte | |
8B8F 7E8344 L_8B8F jmp system_error ; cause error | |
8B92 CC0005 L_8B92 ldd #$0005 ; bytes per element | |
8B95 DD64 std <$64 | |
8B97 DC37 ldd <$37 | |
8B99 ED84 std ,x ; array name | |
8B9B D603 ldb <$03 | |
8B9D E704 stb 4,x ; number of dimensions | |
8B9F BD8331 jsr L_8331 ; memory check | |
8BA2 9F41 stx <$41 ; start of array header | |
8BA4 C60B L_8BA4 ldb #$0b ; default number of elements | |
8BA6 4F clra | |
8BA7 0D05 tst <$05 | |
8BA9 2705 beq L_8BB0 | |
8BAB 3506 puls a,b | |
8BAD C30001 addd #$0001 | |
8BB0 ED05 L_8BB0 std 5,x | |
8BB2 8D5D bsr L_8C11 ; D = word at 5,X * word at $64 | |
8BB4 DD64 std <$64 | |
8BB6 3002 leax 2,x | |
8BB8 0A03 dec <$03 | |
8BBA 26E8 bne L_8BA4 ; next dimension | |
8BBC 9F0F stx <$0f ; start of array element storage | |
8BBE D30F addd <$0f ; D = end of array | |
8BC0 1025F77E lbcs OM_error ; ?OM ERROR | |
8BC4 1F01 tfr d,x | |
8BC6 BD8335 jsr L_8335 ; memory check (also adds #$3a to D) | |
8BC9 830035 subd #$0035 | |
8BCC DD1F std <$1f ; end of BASIC storage | |
8BCE 4F clra | |
8BCF 301F L_8BCF leax -1,x ; clear array | |
8BD1 A705 sta 5,x | |
8BD3 9C0F cmpx <$0f | |
8BD5 26F8 bne L_8BCF | |
8BD7 9E41 ldx <$41 ; array header | |
8BD9 961F lda <$1f ; end of BASIC storage | |
8BDB 9341 subd <$41 | |
8BDD ED02 std 2,x ; offset to next array (when it's created) | |
8BDF 9605 lda <$05 | |
8BE1 262D bne L_8C10 ; RTS | |
8BE3 E604 L_8BE3 ldb 4,x | |
8BE5 D703 stb <$03 | |
8BE7 4F clra | |
8BE8 5F clrb | |
8BE9 DD64 L_8BE9 std <$64 | |
8BEB 3506 puls a,b | |
8BED DD52 std <$52 | |
8BEF 10A305 cmpd 5,x | |
8BF2 243A bcc do_bs_error_8C2E ; ?BS ERROR | |
8BF4 DE64 ldu <$64 | |
8BF6 2704 beq L_8BFC | |
8BF8 8D17 bsr L_8C11 ; D = word at 5,X * word at $64 | |
8BFA D352 addd <$52 | |
8BFC 3002 L_8BFC leax 2,x | |
8BFE 0A03 dec <$03 | |
8C00 26E7 bne L_8BE9 | |
8C02 EDE3 std ,--s | |
8C04 58 lslb | |
8C05 49 rola | |
8C06 58 lslb | |
8C07 49 rola | |
8C08 E3E1 addd ,s++ ; D = D * 5 | |
8C0A 308B leax d,x | |
8C0C 3005 leax 5,x | |
8C0E 9F39 stx <$39 | |
8C10 39 L_8C10 rts | |
8C11 8610 L_8C11 lda #$10 ; * D = word at 5,X * word at $64 | |
8C13 9745 sta <$45 | |
8C15 EC05 ldd 5,x | |
8C17 DD17 std <$17 | |
8C19 4F clra | |
8C1A 5F clrb | |
8C1B 58 L_8C1B lslb | |
8C1C 49 rola | |
8C1D 250F bcs do_bs_error_8C2E ; ?BS ERROR | |
8C1F 0865 lsl <$65 | |
8C21 0964 rol <$64 | |
8C23 2404 bcc L_8C29 | |
8C25 D317 addd <$17 | |
8C27 2505 bcs do_bs_error_8C2E ; ?BS ERROR | |
8C29 0A45 L_8C29 dec <$45 | |
8C2B 26EE bne L_8C1B | |
8C2D 39 rts | |
8C2E 7E8B8A do_bs_error_8C2E jmp BS_error ; ?BS ERROR | |
8C31 1F40 MEM_dispatch tfr s,d ; * MEM | |
8C33 7E9FCE jmp mem_patch ; ...continued | |
8C36 4F Assign8Bit clra ; * assign B to FPA1 | |
8C37 0F06 GIVABF clr <$06 ; numeric / string flag | |
8C39 DD50 std <$50 | |
8C3B C690 ldb #$90 | |
8C3D 7E942D jmp L_942D ; signed assign! | |
8C40 BD8874 STRstr_dispatch jsr L_8874 ; validate numeric expression | |
8C43 CE03D9 ldu #$03d9 | |
8C46 BD958A jsr L_958A ; convert FPA1 to string at U | |
8C49 3262 leas 2,s ; lose return address | |
8C4B 8E03D8 ldx #$03d8 | |
8C4E 200B bra L_8C5B ; compile literal string at X | |
8C50 9F4D L_8C50 stx <$4d ; * B = $56 = length of block | |
8C52 8D5F L_8C52 bsr L_8CB3 ; reserve B bytes of string space | |
8C54 9F58 L_8C54 stx <$58 | |
8C56 D756 stb <$56 | |
8C58 39 rts | |
8C59 301F L_8C59 leax -1,x ; * if copied to string space, start & end also in $58 & $4d | |
8C5B 8622 L_8C5B lda #$22 | |
8C5D 9701 L_8C5D sta <$01 | |
8C5F 9702 sta <$02 | |
8C61 3001 L_8C61 leax 1,x | |
8C63 9F62 stx <$62 | |
8C65 9F58 stx <$58 | |
8C67 C6FF ldb #$ff | |
8C69 5C L_8C69 incb | |
8C6A A680 lda ,x+ | |
8C6C 270C beq L_8C7A | |
8C6E 9101 cmpa <$01 | |
8C70 2704 beq L_8C76 | |
8C72 9102 cmpa <$02 | |
8C74 26F3 bne L_8C69 | |
8C76 8122 L_8C76 cmpa #$22 | |
8C78 2702 beq L_8C7C | |
8C7A 301F L_8C7A leax -1,x | |
8C7C 9F64 L_8C7C stx <$64 | |
8C7E D756 stb <$56 | |
8C80 BD0197 jsr >$0197 ; PATCH - reset BASIC memory | |
8C83 DE62 ldu <$62 | |
8C85 118303D9 cmpu #$03d9 | |
8C89 2207 bhi L_8C92 ; push temp string onto varptr stack | |
8C8B 8DC3 bsr L_8C50 ; reserve B bytes of string space | |
8C8D 9E62 ldx <$62 | |
8C8F BD8D8B jsr L_8D8B ; copy string of length B from X+ to ($25)+ | |
8C92 9E0B L_8C92 ldx <$0b | |
8C94 8C01D1 cmpx #$01d1 | |
8C97 2605 bne L_8C9E | |
8C99 C61E ldb #$1e ; ?ST ERROR | |
8C9B 7E8344 L_8C9B jmp system_error ; cause error | |
8C9E 9656 L_8C9E lda <$56 | |
8CA0 A784 sta ,x | |
8CA2 DC58 ldd <$58 | |
8CA4 ED02 std 2,x | |
8CA6 86FF lda #$ff | |
8CA8 9706 sta <$06 ; numeric / string flag | |
8CAA 9F0D stx <$0d | |
8CAC 9F52 stx <$52 | |
8CAE 3005 leax 5,x | |
8CB0 9F0B stx <$0b | |
8CB2 39 rts | |
8CB3 0F07 L_8CB3 clr <$07 ; * requested block also in $25 | |
8CB5 4F L_8CB5 clra | |
8CB6 3406 pshs a,b | |
8CB8 DC23 ldd <$23 ; top of free string space | |
8CBA A3E0 subd ,s+ | |
8CBC 109321 cmpd <$21 ; stack root / string storage start | |
8CBF 250A bcs L_8CCB ; not enough space | |
8CC1 DD23 std <$23 ; new free pointer | |
8CC3 9E23 ldx <$23 | |
8CC5 3001 leax 1,x | |
8CC7 9F25 stx <$25 ; points to requested block | |
8CC9 3584 puls b,pc | |
8CCB C61A L_8CCB ldb #$1a ; ?OS ERROR | |
8CCD 0307 com <$07 | |
8CCF 27CA beq L_8C9B ; already done garbage collect - give up | |
8CD1 8D04 bsr string_gc ; string garbage collect | |
8CD3 3504 puls b | |
8CD5 20DE bra L_8CB5 ; try to reserve space again | |
8CD7 9E27 string_gc ldx <$27 ; top of BASIC RAM | |
8CD9 9F23 L_8CD9 stx <$23 ; top of free string space | |
8CDB 4F clra | |
8CDC 5F clrb | |
8CDD DD4B std <$4b | |
8CDF 9E21 ldx <$21 ; stack root / string storage start | |
8CE1 9F47 stx <$47 | |
8CE3 8E01A9 ldx #$01a9 | |
8CE6 9C0B L_8CE6 cmpx <$0b | |
8CE8 2704 beq L_8CEE | |
8CEA 8D32 bsr L_8D1E | |
8CEC 20F8 bra L_8CE6 | |
8CEE 9E1B L_8CEE ldx <$1b ; start of simple variables | |
8CF0 9C1D L_8CF0 cmpx <$1d ; start of array variables | |
8CF2 2704 beq L_8CF8 | |
8CF4 8D22 bsr L_8D18 | |
8CF6 20F8 bra L_8CF0 | |
8CF8 9F41 L_8CF8 stx <$41 | |
8CFA 9E41 L_8CFA ldx <$41 | |
8CFC 9C1F L_8CFC cmpx <$1f ; end of BASIC storage | |
8CFE 2735 beq L_8D35 | |
8D00 EC02 ldd 2,x | |
8D02 D341 addd <$41 | |
8D04 DD41 std <$41 | |
8D06 A601 lda 1,x | |
8D08 2AF0 bpl L_8CFA | |
8D0A E604 ldb 4,x | |
8D0C 58 lslb | |
8D0D CB05 addb #$05 | |
8D0F 3A abx | |
8D10 9C41 L_8D10 cmpx <$41 | |
8D12 27E8 beq L_8CFC | |
8D14 8D08 bsr L_8D1E | |
8D16 20F8 bra L_8D10 | |
8D18 A601 L_8D18 lda 1,x | |
8D1A 3002 leax 2,x | |
8D1C 2A14 bpl L_8D32 | |
8D1E E684 L_8D1E ldb ,x | |
8D20 2710 beq L_8D32 | |
8D22 EC02 ldd 2,x | |
8D24 109323 cmpd <$23 ; top of free string space | |
8D27 2209 bhi L_8D32 | |
8D29 109347 cmpd <$47 | |
8D2C 2304 bls L_8D32 | |
8D2E 9F4B stx <$4b | |
8D30 DD47 std <$47 | |
8D32 3005 L_8D32 leax 5,x | |
8D34 39 L_8D34 rts | |
8D35 9E4B L_8D35 ldx <$4b | |
8D37 27FB beq L_8D34 | |
8D39 4F clra | |
8D3A E684 ldb ,x | |
8D3C 5A decb | |
8D3D D347 addd <$47 | |
8D3F DD43 std <$43 | |
8D41 9E23 ldx <$23 ; top of free string space | |
8D43 9F41 stx <$41 | |
8D45 BD831E jsr L_831E ; move memory contents up (no memory check) | |
8D48 9E4B ldx <$4b | |
8D4A DC45 ldd <$45 | |
8D4C ED02 std 2,x | |
8D4E 9E45 ldx <$45 | |
8D50 301F leax -1,x | |
8D52 7E8CD9 jmp L_8CD9 | |
8D55 DC52 L_8D55 ldd <$52 ; * handle '+' in a string expression (concatenate) | |
8D57 3406 pshs a,b | |
8D59 BD8954 jsr L_8954 ; evaluate sub-expression | |
8D5C BD8877 jsr get_expr ; validate string expression | |
8D5F 3510 puls x | |
8D61 9F62 stx <$62 | |
8D63 E684 ldb ,x | |
8D65 9E52 ldx <$52 | |
8D67 EB84 addb ,x ; add string lengths | |
8D69 2405 bcc L_8D70 ; not too long | |
8D6B C61C ldb #$1c ; ?LS ERROR | |
8D6D 7E8344 jmp system_error ; cause error | |
8D70 BD8C50 L_8D70 jsr L_8C50 ; reserve B bytes of string space | |
8D73 9E62 ldx <$62 | |
8D75 E684 ldb ,x | |
8D77 8D10 bsr L_8D89 ; copy string (len B) from varptr X to ($25)+ | |
8D79 9E4D ldx <$4d | |
8D7B 8D22 bsr DELVAR ; point X to string & length in B | |
8D7D 8D0C bsr L_8D8B ; copy string of length B from X+ to ($25)+ | |
8D7F 9E62 ldx <$62 | |
8D81 8D1C bsr DELVAR ; point X to string & length in B | |
8D83 BD8C92 jsr L_8C92 ; push temp string onto varptr stack | |
8D86 7E8899 jmp L_8899 ; back to expression handler | |
8D89 AE02 L_8D89 ldx 2,x ; * copy string of length B from varptr X to ($25)+ | |
8D8B DE25 L_8D8B ldu <$25 ; * copy string of length B from X+ to ($25)+ | |
8D8D 5C incb | |
8D8E 2004 bra L_8D94 | |
8D90 A680 L_8D90 lda ,x+ | |
8D92 A7C0 sta ,u+ | |
8D94 5A L_8D94 decb | |
8D95 26F9 bne L_8D90 | |
8D97 DF25 stu <$25 | |
8D99 39 rts | |
8D9A BD8877 L_8D9A jsr get_expr ; validate string expression | |
8D9D 9E52 L_8D9D ldx <$52 | |
8D9F E684 DELVAR ldb ,x | |
8DA1 8D18 bsr L_8DBB ; if X is top of string stack then pull it | |
8DA3 2613 bne L_8DB8 ; normal varptr | |
8DA5 AE07 ldx 7,x | |
8DA7 301F leax -1,x | |
8DA9 9C23 cmpx <$23 ; top of free string space | |
8DAB 2608 bne L_8DB5 | |
8DAD 3404 pshs b | |
8DAF D323 addd <$23 ; top of free string space | |
8DB1 DD23 std <$23 ; top of free string space | |
8DB3 3504 puls b | |
8DB5 3001 L_8DB5 leax 1,x | |
8DB7 39 rts | |
8DB8 AE02 L_8DB8 ldx 2,x | |
8DBA 39 rts | |
8DBB 9C0D L_8DBB cmpx <$0d ; * if X is top of string stack then pull it | |
8DBD 2607 bne L_8DC6 | |
8DBF 9F0B stx <$0b | |
8DC1 301B leax -5,x | |
8DC3 9F0D stx <$0d | |
8DC5 4F clra | |
8DC6 39 L_8DC6 rts | |
8DC7 8D03 LEN_dispatch bsr L_8DCC ; validate string & test length | |
8DC9 7E8C36 L_8DC9 jmp Assign8Bit ; assign B to FPA1 | |
8DCC 8DCC L_8DCC bsr L_8D9A ; validate string & point X to it | |
8DCE 0F06 clr <$06 ; numeric / string flag | |
8DD0 5D tstb | |
8DD1 39 rts | |
8DD2 BD8E54 CHRstr_dispatch jsr L_8E54 ; read 8 bit value into B from FPA1 | |
8DD5 C601 L_8DD5 ldb #$01 | |
8DD7 BD8CB3 jsr L_8CB3 ; reserve B bytes of string space | |
8DDA 9653 lda <$53 | |
8DDC BD8C54 jsr L_8C54 ; store string details as for temp string | |
8DDF A784 sta ,x | |
8DE1 3262 L_8DE1 leas 2,s | |
8DE3 7E8C92 L_8DE3 jmp L_8C92 ; push temp string onto varptr stack | |
8DE6 8D02 ASC_dispatch bsr L_8DEA ; get 1st character of string into B | |
8DE8 20DF bra L_8DC9 ; assign B to FPA1 | |
8DEA 8DE0 L_8DEA bsr L_8DCC ; validate string & test length | |
8DEC 275E beq do_fc_error_8E4C ; ?FC ERROR | |
8DEE E684 ldb ,x | |
8DF0 39 rts | |
8DF1 8D48 LEFTstr_dispatch bsr L_8E3B ; get str varptr in X & $4D, arg. in A & B | |
8DF3 4F L_8DF3 clra | |
8DF4 E184 L_8DF4 cmpb ,x | |
8DF6 2303 bls L_8DFB ; number of chrs <= string length | |
8DF8 E684 ldb ,x | |
8DFA 4F clra | |
8DFB 3406 L_8DFB pshs a,b | |
8DFD BD8C52 jsr L_8C52 ; reserve B bytes of string space | |
8E00 9E4D ldx <$4d | |
8E02 8D9B bsr DELVAR ; point X to string & length in B | |
8E04 3504 puls b | |
8E06 3A abx ; adjust string start for MID$ / RIGHT$ | |
8E07 3504 puls b | |
8E09 BD8D8B jsr L_8D8B ; copy string of length B from X+ to ($25)+ | |
8E0C 20D5 bra L_8DE3 ; push temp string onto varptr stack | |
8E0E 8D2B RIGHTstr_dispatch bsr L_8E3B ; get str varptr in X & $4D, arg. in A & B | |
8E10 A084 suba ,x | |
8E12 40 nega ; A = string length - argument | |
8E13 20DF bra L_8DF4 ; create new string | |
8E15 C6FF MIDstr_dispatch ldb #$ff ; default length | |
8E17 D753 stb <$53 | |
8E19 9DA5 jsr <$a5 ; get current character from BASIC source | |
8E1B 8129 cmpa #$29 | |
8E1D 2705 beq L_8E24 ; length not specified | |
8E1F BD89AA jsr CkComa ; skip comma | |
8E22 8D2D bsr Get8Bit ; get number into B (& $53) | |
8E24 8D15 L_8E24 bsr L_8E3B ; get str varptr in X & $4D, arg. in A & B | |
8E26 2724 beq do_fc_error_8E4C ; ?FC ERROR | |
8E28 5F clrb | |
8E29 4A deca ; A = pos - 1 | |
8E2A A184 cmpa ,x | |
8E2C 24CD bcc L_8DFB ; pos past end - create empty string | |
8E2E 1F89 tfr a,b | |
8E30 E084 subb ,x | |
8E32 50 negb ; B = string length - pos | |
8E33 D153 cmpb <$53 | |
8E35 23C4 bls L_8DFB ; no. of chrs available <= requested length | |
8E37 D653 ldb <$53 | |
8E39 20C0 bra L_8DFB ; use requested length | |
8E3B BD89A4 L_8E3B jsr CkClBrak ; skip close bracket | |
8E3E EEE4 ldu ,s | |
8E40 AE65 ldx 5,s | |
8E42 9F4D stx <$4d | |
8E44 A664 lda 4,s | |
8E46 E664 ldb 4,s | |
8E48 3267 leas 7,s | |
8E4A 1F35 tfr u,pc | |
8E4C 7E8B8D do_fc_error_8E4C jmp FC_error ; ?FC ERROR | |
8E4F 9D9F L_8E4F jsr <$9f ; get next character from BASIC source | |
8E51 BD8872 Get8Bit jsr L_8872 ; read numeric expression into FPA1 | |
8E54 BD8B26 L_8E54 jsr L_8B26 ; read unsigned number into $52 & D from FPA1 | |
8E57 4D tsta | |
8E58 26F2 bne do_fc_error_8E4C ; ?FC ERROR | |
8E5A 0EA5 jmp <$a5 ; get current character from BASIC source | |
8E5C BD8DCC VAL_dispatch jsr L_8DCC ; validate string & test length | |
8E5F 1027031F lbeq L_9182 ; clear exponents in FPA1 ($4f & $54) | |
8E63 DEA6 ldu <$a6 ; save source pointer | |
8E65 9FA6 stx <$a6 ; point source pointer to start of string | |
8E67 3A abx | |
8E68 A684 lda ,x ; save byte at end of string | |
8E6A 3452 pshs a,x,u | |
8E6C 6F84 clr ,x ; put a zero at end of string | |
8E6E 9DA5 jsr <$a5 ; get current character from BASIC source | |
8E70 BD94BD jsr L_94BD ; read numeric expression into FPA1 | |
8E73 3552 puls a,x,u | |
8E75 A784 sta ,x ; restore byte at end of string | |
8E77 DFA6 stu <$a6 ; restore source pointer | |
8E79 39 rts | |
8E7A 8D07 L_8E7A bsr Get16Bit ; read 16 bit number into X | |
8E7C 9F2B stx <$2b | |
8E7E BD89AA L_8E7E jsr CkComa ; skip comma | |
8E81 20CE bra Get8Bit ; get number into B | |
8E83 BD8872 Get16Bit jsr L_8872 ; read numeric expression into FPA1 | |
8E86 9654 L_8E86 lda <$54 ; * read 16 bit unsigned number into X from FPA1 | |
8E88 2BC2 bmi do_fc_error_8E4C ; ?FC ERROR | |
8E8A 964F lda <$4f | |
8E8C 8190 cmpa #$90 | |
8E8E 22BC bhi do_fc_error_8E4C ; ?FC ERROR | |
8E90 BD9473 jsr L_9473 ; denormalize FPA1 to an integer | |
8E93 9E52 ldx <$52 | |
8E95 39 rts | |
8E96 8DEE PEEK_dispatch bsr L_8E86 ; read 16 bit number into X from FPA1 | |
8E98 E684 ldb ,x | |
8E9A 7E8C36 jmp Assign8Bit ; assign B to FPA1 | |
8E9D 8DDB POKE_dispatch bsr L_8E7A ; read pair of numbers into $2b/2c & B | |
8E9F 9E2B ldx <$2b | |
8EA1 E784 stb ,x | |
8EA3 39 rts | |
8EA4 C6FE LLIST_dispatch ldb #$fe ; * LLIST | |
8EA6 D76F stb <$6f ; DEVN | |
8EA8 9DA5 jsr <$a5 ; get current character from BASIC source | |
8EAA 3401 LIST_dispatch pshs cc ; * LIST | |
8EAC BD869A jsr L_869A ; read line number & store in $2b | |
8EAF BD83FF jsr basic_line_after_2b ; search program for line number in <$2b | |
8EB2 9F66 stx <$66 | |
8EB4 3501 puls cc | |
8EB6 2712 beq L_8ECA | |
8EB8 9DA5 jsr <$a5 ; get current character from BASIC source | |
8EBA 2713 beq L_8ECF | |
8EBC 81C4 cmpa #$c4 ; token - | |
8EBE 2609 bne L_8EC9 | |
8EC0 9D9F jsr <$9f ; get next character from BASIC source | |
8EC2 2706 beq L_8ECA | |
8EC4 BD869A jsr L_869A ; read line number & store in $2b | |
8EC7 2706 beq L_8ECF | |
8EC9 39 L_8EC9 rts | |
8ECA CEFFFF L_8ECA ldu #$ffff | |
8ECD DF2B stu <$2b | |
8ECF 3262 L_8ECF leas 2,s | |
8ED1 9E66 ldx <$66 | |
8ED3 BD90A5 L_8ED3 jsr L_90A5 ; initialise virtual DEVN device & new line | |
8ED6 BDB77B jsr L_B77B ; scan for BREAK & pause if DEVN is not -1 | |
8ED9 EC84 ldd ,x | |
8EDB 2608 bne L_8EE5 | |
8EDD BDB663 L_8EDD jsr L_B663 ; close DEVN stream | |
8EE0 0F6F clr <$6f ; DEVN | |
8EE2 7E8371 jmp goto_ok_prompt ; command mode | |
8EE5 9F66 L_8EE5 stx <$66 | |
8EE7 EC02 ldd 2,x | |
8EE9 10932B cmpd <$2b | |
8EEC 22EF bhi L_8EDD | |
8EEE BD957A jsr print_D ; print unsigned number in D | |
8EF1 BD90F5 jsr L_90F5 ; print a space to DEVN | |
8EF4 9E66 ldx <$66 | |
8EF6 8D10 bsr L_8F08 ; detokenize BASIC line | |
8EF8 AE9F0066 ldx [$0066] | |
8EFC CE02DD ldu #$02dd | |
8EFF A6C0 L_8EFF lda ,u+ | |
8F01 27D0 beq L_8ED3 | |
8F03 BD90FA jsr L_90FA ; output character to DEVN | |
8F06 20F7 bra L_8EFF | |
8F08 BD01A6 L_8F08 jsr >$01a6 ; PATCH - detokenize | |
8F0B 3004 leax 4,x | |
8F0D 108E02DD ldy #$02dd | |
8F11 A680 L_8F11 lda ,x+ | |
8F13 2751 beq L_8F66 | |
8F15 2B15 bmi L_8F2C | |
8F17 813A cmpa #$3a | |
8F19 260D bne L_8F28 | |
8F1B E684 ldb ,x | |
8F1D C184 cmpb #$84 | |
8F1F 27F0 beq L_8F11 | |
8F21 C183 cmpb #$83 | |
8F23 27EC beq L_8F11 | |
8F25 8C fcb $8c ; cmpx #$8621 - comment byte | |
8F26 8621 L_8F26 lda #$21 ; usually skipped by comment byte | |
8F28 8D30 L_8F28 bsr L_8F5A | |
8F2A 20E5 bra L_8F11 | |
8F2C CE0116 L_8F2C ldu #$0116 | |
8F2F 81FF cmpa #$ff | |
8F31 2604 bne L_8F37 | |
8F33 A680 lda ,x+ | |
8F35 3345 leau 5,u | |
8F37 847F L_8F37 anda #$7f | |
8F39 334A L_8F39 leau 10,u | |
8F3B 6DC4 tst ,u | |
8F3D 27E7 beq L_8F26 | |
8F3F A0C4 suba ,u | |
8F41 2AF6 bpl L_8F39 | |
8F43 ABC4 adda ,u | |
8F45 EE41 ldu 1,u | |
8F47 4A L_8F47 deca | |
8F48 2B06 bmi L_8F50 | |
8F4A 6DC0 L_8F4A tst ,u+ | |
8F4C 2AFC bpl L_8F4A | |
8F4E 20F7 bra L_8F47 | |
8F50 A6C4 L_8F50 lda ,u | |
8F52 8D06 bsr L_8F5A | |
8F54 6DC0 tst ,u+ | |
8F56 2AF8 bpl L_8F50 | |
8F58 20B7 bra L_8F11 | |
8F5A 108C03D6 L_8F5A cmpy #$03d6 | |
8F5E 2406 bcc L_8F66 | |
8F60 847F anda #$7f | |
8F62 A7A0 sta ,y+ | |
8F64 6FA4 clr ,y | |
8F66 39 L_8F66 rts | |
8F67 BD01A3 L_8F67 jsr >$01a3 ; PATCH - tokenize | |
8F6A 9EA6 ldx <$a6 ; BASIC source pointer | |
8F6C CE02DC ldu #$02dc | |
8F6F 0F43 L_8F6F clr <$43 | |
8F71 0F44 clr <$44 | |
8F73 A680 L_8F73 lda ,x+ | |
8F75 2721 beq L_8F98 | |
8F77 0D43 tst <$43 | |
8F79 270F beq L_8F8A | |
8F7B BD8ADF jsr L_8ADF ; carry clear if A-Z | |
8F7E 2418 bcc L_8F98 | |
8F80 8130 cmpa #$30 | |
8F82 2504 bcs L_8F88 | |
8F84 8139 cmpa #$39 | |
8F86 2310 bls L_8F98 | |
8F88 0F43 L_8F88 clr <$43 | |
8F8A 8120 L_8F8A cmpa #$20 | |
8F8C 270A beq L_8F98 | |
8F8E 9742 sta <$42 | |
8F90 8122 cmpa #$22 | |
8F92 2738 beq L_8FCC | |
8F94 0D44 tst <$44 | |
8F96 2719 beq L_8FB1 | |
8F98 A7C0 L_8F98 sta ,u+ | |
8F9A 2706 beq L_8FA2 | |
8F9C 813A cmpa #$3a | |
8F9E 27CF beq L_8F6F | |
8FA0 20D1 L_8FA0 bra L_8F73 | |
8FA2 6FC0 L_8FA2 clr ,u+ | |
8FA4 6FC0 clr ,u+ | |
8FA6 1F30 tfr u,d | |
8FA8 8302DA subd #$02da | |
8FAB 8E02DB ldx #$02db | |
8FAE 9FA6 stx <$a6 ; BASIC source pointer | |
8FB0 39 rts | |
8FB1 813F L_8FB1 cmpa #$3f | |
8FB3 2604 bne L_8FB9 | |
8FB5 8687 lda #$87 | |
8FB7 20DF bra L_8F98 | |
8FB9 8127 L_8FB9 cmpa #$27 | |
8FBB 2613 bne L_8FD0 | |
8FBD CC3A83 ldd #$3a83 | |
8FC0 EDC1 std ,u++ | |
8FC2 0F42 L_8FC2 clr <$42 | |
8FC4 A680 L_8FC4 lda ,x+ | |
8FC6 27D0 beq L_8F98 | |
8FC8 9142 cmpa <$42 | |
8FCA 27CC beq L_8F98 | |
8FCC A7C0 L_8FCC sta ,u+ | |
8FCE 20F4 bra L_8FC4 | |
8FD0 8130 L_8FD0 cmpa #$30 | |
8FD2 2504 bcs L_8FD8 | |
8FD4 813C cmpa #$3c | |
8FD6 25C0 bcs L_8F98 | |
8FD8 301F L_8FD8 leax -1,x | |
8FDA 3450 pshs x,u | |
8FDC 0F41 clr <$41 | |
8FDE CE0116 ldu #$0116 | |
8FE1 0F42 L_8FE1 clr <$42 | |
8FE3 334A L_8FE3 leau 10,u | |
8FE5 A6C4 lda ,u | |
8FE7 2731 beq L_901A | |
8FE9 10AE41 ldy 1,u | |
8FEC AEE4 L_8FEC ldx ,s | |
8FEE E6A0 L_8FEE ldb ,y+ | |
8FF0 E080 subb ,x+ | |
8FF2 27FA beq L_8FEE | |
8FF4 C180 cmpb #$80 | |
8FF6 2638 bne L_9030 | |
8FF8 3262 leas 2,s | |
8FFA 3540 puls u | |
8FFC DA42 orb <$42 | |
8FFE 9641 lda <$41 | |
9000 2606 bne L_9008 | |
9002 C184 cmpb #$84 | |
9004 2606 bne L_900C | |
9006 863A lda #$3a | |
9008 EDC1 L_9008 std ,u++ | |
900A 2094 bra L_8FA0 | |
900C E7C0 L_900C stb ,u+ | |
900E C186 cmpb #$86 | |
9010 2602 bne L_9014 | |
9012 0C44 inc <$44 | |
9014 C182 L_9014 cmpb #$82 | |
9016 27AA beq L_8FC2 | |
9018 2086 L_9018 bra L_8FA0 | |
901A CE011B L_901A ldu #$011b | |
901D 0341 com <$41 | |
901F 26C0 bne L_8FE1 | |
9021 3550 puls x,u | |
9023 A680 lda ,x+ | |
9025 A7C0 sta ,u+ | |
9027 BD8ADF jsr L_8ADF ; carry clear if A-Z | |
902A 25EC bcs L_9018 | |
902C 0343 com <$43 | |
902E 20E8 bra L_9018 | |
9030 0C42 L_9030 inc <$42 | |
9032 4A deca | |
9033 27AE beq L_8FE3 | |
9035 313F leay -1,y | |
9037 E6A0 L_9037 ldb ,y+ | |
9039 2AFC bpl L_9037 | |
903B 20AF bra L_8FEC | |
903D 2762 PRINT_dispatch beq print_CR ; send CR to DEVN | |
903F 8D03 bsr L_9044 | |
9041 0F6F clr <$6f ; DEVN | |
9043 39 rts | |
9044 8140 L_9044 cmpa #$40 | |
9046 2605 bne L_904D | |
9048 BDB786 jsr L_B786 ; handle PRINT@ | |
904B 200A bra L_9057 | |
904D 8123 L_904D cmpa #$23 | |
904F 260D bne L_905E | |
9051 BDB7D7 jsr L_B7D7 ; read #-n & set up DEVN | |
9054 BDB63C jsr L_B63C ; if DEVN = -1, test cassette OK for output | |
9057 9DA5 L_9057 jsr <$a5 ; get current character from BASIC source | |
9059 2746 beq print_CR ; send CR to DEVN | |
905B BD89AA jsr CkComa ; skip comma | |
905E 81CD L_905E cmpa #$cd ; token USING | |
9060 102711C1 lbeq L_A225 | |
9064 2748 L_9064 beq L_90AE ; RTS | |
9066 81BB L_9066 cmpa #$bb ; token TAB( | |
9068 275D beq L_90C7 | |
906A 812C cmpa #$2c | |
906C 2741 beq L_90AF | |
906E 813B cmpa #$3b | |
9070 276E beq L_90E0 ; skip semicolon | |
9072 BD8887 jsr get_string ; get expression | |
9075 9606 lda <$06 ; numeric / string flag | |
9077 3402 pshs a | |
9079 2606 bne L_9081 ; string expression | |
907B BD9587 jsr L_9587 ; convert FPA1 to string at $3DA | |
907E BD8C59 jsr L_8C59 ; register string at X | |
9081 8D65 L_9081 bsr L_90E8 ; print string just compiled | |
9083 3504 puls b | |
9085 BDB595 jsr L_B595 ; initialise virtual DEVN device | |
9088 0D6E tst <$6e ; cassette IO flag | |
908A 2706 beq L_9092 ; no IO in progress | |
908C 8D13 bsr print_CR ; send CR to DEVN | |
908E 9DA5 jsr <$a5 ; get current character from BASIC source | |
9090 20D2 bra L_9064 | |
9092 5D L_9092 tstb | |
9093 2608 bne L_909D ; string just printed so no space | |
9095 9DA5 jsr <$a5 ; get current character from BASIC source | |
9097 812C cmpa #$2c | |
9099 2714 beq L_90AF | |
909B 8D58 bsr L_90F5 ; print a space to DEVN | |
909D 9DA5 L_909D jsr <$a5 ; get current character from BASIC source | |
909F 26C5 bne L_9066 | |
90A1 860D print_CR lda #$0d ; * send CR to DEVN | |
90A3 2055 bra L_90FA ; output character to DEVN | |
90A5 BDB595 L_90A5 jsr L_B595 ; initialise virtual DEVN device | |
90A8 27F7 beq print_CR ; send CR to DEVN | |
90AA 966C lda <$6c ; device current column | |
90AC 26F3 bne print_CR ; send CR to DEVN | |
90AE 39 L_90AE rts | |
90AF BDB595 L_90AF jsr L_B595 ; initialise virtual DEVN device | |
90B2 270A beq L_90BE | |
90B4 D66C ldb <$6c ; device current column | |
90B6 D16B cmpb <$6b ; device last comma field | |
90B8 2506 bcs L_90C0 | |
90BA 8DE5 bsr print_CR ; send CR to DEVN | |
90BC 2022 bra L_90E0 | |
90BE D66C L_90BE ldb <$6c ; device current column | |
90C0 D06A L_90C0 subb <$6a ; device comma field width | |
90C2 24FC bcc L_90C0 | |
90C4 50 negb | |
90C5 2010 bra L_90D7 | |
90C7 BD8E4F L_90C7 jsr L_8E4F ; skip character & get number in B | |
90CA 8129 cmpa #$29 | |
90CC 1026F8E4 lbne SN_error ; ?SN ERROR | |
90D0 BDB595 jsr L_B595 ; initialise virtual DEVN device | |
90D3 D06C subb <$6c ; device current column | |
90D5 2309 bls L_90E0 | |
90D7 0D6E L_90D7 tst <$6e ; cassette IO flag | |
90D9 2605 bne L_90E0 ; IO in progress | |
90DB 8D18 L_90DB bsr L_90F5 ; print a space to DEVN | |
90DD 5A decb | |
90DE 26FB bne L_90DB | |
90E0 9D9F L_90E0 jsr <$9f ; get next character from BASIC source | |
90E2 7E9064 jmp L_9064 | |
90E5 BD8C5B out_string jsr L_8C5B ; compile literal string at X | |
90E8 BD8D9D L_90E8 jsr L_8D9D ; point X to string just compiled & len in B | |
90EB 5C incb | |
90EC 5A L_90EC decb | |
90ED 27BF beq L_90AE ; RTS | |
90EF A680 lda ,x+ | |
90F1 8D07 bsr L_90FA ; output character to DEVN | |
90F3 20F7 bra L_90EC | |
90F5 8620 L_90F5 lda #$20 ; * print a space to DEVN | |
90F7 8C fcb $8c ; cmpx #L_863F - comment byte | |
90F8 863F L_90F8 lda #$3f ; usually skipped by comment byte | |
90FA 7EB54A L_90FA jmp OUTCHR ; output character to DEVN | |
90FD 8E966E L_90FD ldx #data_966E ; FP constant 0.5 | |
9100 2009 bra L_910B ; add varptr X to FPA1 | |
9102 BD92DA L_9102 jsr L_92DA ; load FPA2 from varptr X | |
9105 0354 oper_minus_dispatch com <$54 | |
9107 0362 com <$62 | |
9109 2003 bra oper_plus_dispatch | |
910B BD92DA L_910B jsr L_92DA ; load FPA2 from varptr X | |
910E 5D oper_plus_dispatch tstb ; FPA1 exponent | |
910F 102702E2 lbeq L_93F5 ; copy FPA2 to FPA1 (because FPA1 zero) | |
9113 8E005C ldx #$005c ; FPA2 | |
9116 1F89 L_9116 tfr a,b ; A = B = FPA2 exponent | |
9118 5D tstb | |
9119 276C beq L_9187 ; RTS (FPA2 is zero) | |
911B D04F subb <$4f ; B = FPA2 exponent - FPA1 exponent | |
911D 2769 beq L_9188 ; FPA1 & FPA2 same order | |
911F 250A bcs L_912B ; FPA1 higher order | |
9121 974F sta <$4f | |
9123 9661 lda <$61 | |
9125 9754 sta <$54 | |
9127 8E004F ldx #$004f ; FPA1 | |
912A 50 negb | |
912B C1F8 L_912B cmpb #$f8 | |
912D 2F59 ble L_9188 ; more than 8 bits to shift | |
912F 4F clra | |
9130 6401 lsr 1,x | |
9132 BD9203 jsr L_9203 ; shift mantissa of varptr X right -B bits | |
9135 D662 L_9135 ldb <$62 ; (carries into A) | |
9137 2A0B bpl L_9144 ; FPA1 & FPA2 same sign | |
9139 6301 com 1,x | |
913B 6302 com 2,x ; 2's complement FPA1 | |
913D 6303 com 3,x ; carry is picked up below | |
913F 6304 com 4,x | |
9141 43 coma | |
9142 8900 adca #$00 | |
9144 9763 L_9144 sta <$63 | |
9146 9653 lda <$53 | |
9148 9960 adca <$60 ; add mantissa in FPA2 to FPA1 | |
914A 9753 sta <$53 | |
914C 9652 lda <$52 | |
914E 995F adca <$5f | |
9150 9752 sta <$52 | |
9152 9651 lda <$51 | |
9154 995E adca <$5e | |
9156 9751 sta <$51 | |
9158 9650 lda <$50 | |
915A 995D adca <$5d | |
915C 9750 sta <$50 | |
915E 5D tstb | |
915F 2A44 bpl L_91A5 ; signs were same | |
9161 2502 L_9161 bcs L_9165 ; normalize FPA1 | |
9163 8D5D bsr L_91C2 ; 2's complent mantissa in FPA1 | |
9165 5F L_9165 clrb | |
9166 9650 L_9166 lda <$50 | |
9168 262E bne L_9198 ; normalize bit-wise | |
916A 9651 lda <$51 | |
916C 9750 sta <$50 | |
916E 9652 lda <$52 | |
9170 9751 sta <$51 | |
9172 9653 lda <$53 | |
9174 9752 sta <$52 | |
9176 9663 lda <$63 | |
9178 9753 sta <$53 | |
917A 0F63 clr <$63 | |
917C CB08 addb #$08 | |
917E C128 cmpb #$28 | |
9180 2DE4 blt L_9166 | |
9182 4F L_9182 clra | |
9183 974F L_9183 sta <$4f | |
9185 9754 sta <$54 | |
9187 39 L_9187 rts | |
9188 8D6D L_9188 bsr L_91F7 ; shift mantissa of varptr X right -B bits | |
918A 5F clrb | |
918B 20A8 bra L_9135 | |
918D 5C L_918D incb | |
918E 0863 lsl <$63 | |
9190 0953 rol <$53 | |
9192 0952 rol <$52 | |
9194 0951 rol <$51 | |
9196 0950 rol <$50 | |
9198 2AF3 L_9198 bpl L_918D | |
919A 964F lda <$4f | |
919C 3404 pshs b | |
919E A0E0 suba ,s+ | |
91A0 974F sta <$4f | |
91A2 23DE bls L_9182 ; clear exponents in FPA1 ($4f & $54) | |
91A4 8C fcb $8c ; cmpx #$2508 - comment byte | |
91A5 2508 L_91A5 bcs L_91AF ; usually skipped by comment byte | |
91A7 0863 lsl <$63 ; * (91A5 2508 BCS $91AF) | |
91A9 8600 lda #$00 | |
91AB 9763 sta <$63 | |
91AD 200C bra L_91BB | |
91AF 0C4F L_91AF inc <$4f | |
91B1 2728 beq OV_error ; ?OV ERROR | |
91B3 0650 ror <$50 | |
91B5 0651 ror <$51 | |
91B7 0652 ror <$52 | |
91B9 0653 ror <$53 | |
91BB 2404 L_91BB bcc L_91C1 | |
91BD 8D0D bsr L_91CC ; add the carry to mantissa in FPA1 | |
91BF 27EE beq L_91AF | |
91C1 39 L_91C1 rts | |
91C2 0354 L_91C2 com <$54 ; * 2's complement mantissa in FPA1 | |
91C4 0350 L_91C4 com <$50 | |
91C6 0351 com <$51 | |
91C8 0352 com <$52 | |
91CA 0353 com <$53 | |
91CC 9E52 L_91CC ldx <$52 | |
91CE 3001 leax 1,x | |
91D0 9F52 stx <$52 | |
91D2 2606 bne L_91DA | |
91D4 9E50 ldx <$50 | |
91D6 3001 leax 1,x | |
91D8 9F50 stx <$50 | |
91DA 39 L_91DA rts | |
91DB C60A OV_error ldb #$0a ; ?OV ERROR | |
91DD 7E8344 jmp system_error ; cause error | |
91E0 8E0012 L_91E0 ldx #$0012 ; * (shifts 8 bits before testing B) | |
91E3 A604 L_91E3 lda 4,x | |
91E5 9763 sta <$63 | |
91E7 A603 lda 3,x | |
91E9 A704 sta 4,x | |
91EB A602 lda 2,x | |
91ED A703 sta 3,x | |
91EF A601 lda 1,x | |
91F1 A702 sta 2,x | |
91F3 965B lda <$5b | |
91F5 A701 sta 1,x | |
91F7 CB08 L_91F7 addb #$08 ; * shift mantissa of varptr X right -B bits | |
91F9 2FE8 ble L_91E3 | |
91FB 9663 lda <$63 | |
91FD C008 subb #$08 | |
91FF 270C beq L_920D ; RTS | |
9201 6701 L_9201 asr 1,x | |
9203 6602 L_9203 ror 2,x | |
9205 6603 ror 3,x | |
9207 6604 ror 4,x | |
9209 46 rora | |
920A 5C incb | |
920B 26F4 bne L_9201 | |
920D 39 L_920D rts | |
920E 8100000000 data_920E fcb $81,$00,$00,$00,$00 ; FP constant 1 | |
9213 037F5E56CB data_9213 fcb $03,$7f,$5e,$56,$cb ; * log series coefficients | |
9218 7980139B0B fcb $79,$80,$13,$9b,$0b | |
921D 6480763893 fcb $64,$80,$76,$38,$93 | |
9222 168238AA3B20 fcb $16,$82,$38,$aa,$3b,$20 | |
9228 803504F334 data_9228 fcb $80,$35,$04,$f3,$34 ; FP constant root 2 / 2 | |
922D 813504F334 data_922D fcb $81,$35,$04,$f3,$34 ; FP constant root 2 | |
9232 8080000000 data_9232 fcb $80,$80,$00,$00,$00 ; FP constant -0.5 | |
9237 80317217F8 data_9237 fcb $80,$31,$72,$17,$f8 ; FP constant ln2 | |
923C BD9418 LOG_dispatch jsr L_9418 ; sets B to -1, 0 or 1 as per sign of FPA1 | |
923F 102FF94A lble FC_error ; ?FC ERROR | |
9243 8E9228 ldx #data_9228 ; FP constant root 2 / 2 | |
9246 964F lda <$4f | |
9248 8080 suba #$80 | |
924A 3402 pshs a | |
924C 8680 lda #$80 | |
924E 974F sta <$4f | |
9250 BD910B jsr L_910B ; add varptr X to FPA1 | |
9253 8E922D ldx #data_922D ; FP constant root 2 | |
9256 BD933A jsr L_933A ; FPA1 = varptr X / FPA1 | |
9259 8E920E ldx #data_920E ; FP constant 1 | |
925C BD9102 jsr L_9102 ; FPA1 = varptr X - FPA1 | |
925F 8E9213 ldx #data_9213 ; series coefficients | |
9262 BD9743 jsr L_9743 ; calculate odd power series | |
9265 8E9232 ldx #data_9232 ; FP constant -0.5 | |
9268 BD910B jsr L_910B ; add varptr X to FPA1 | |
926B 3504 puls b | |
926D BD9547 jsr L_9547 ; add B to FPA1 | |
9270 8E9237 ldx #data_9237 ; FP constant ln2 | |
9273 8D65 L_9273 bsr L_92DA ; load FPA2 from varptr X | |
9275 2762 oper_mul_dispatch beq L_92D9 ; RTS (FPA1 zero) | |
9277 8D7A bsr L_92F3 ; add A to exponent in FPA1 | |
9279 8600 L_9279 lda #$00 | |
927B 9713 sta <$13 | |
927D 9714 sta <$14 | |
927F 9715 sta <$15 | |
9281 9716 sta <$16 | |
9283 D653 ldb <$53 | |
9285 8D22 bsr L_92A9 ; multiply mantissa in FPA2 by B | |
9287 D663 ldb <$63 | |
9289 D7AE stb <$ae | |
928B D652 ldb <$52 | |
928D 8D1A bsr L_92A9 ; multiply mantissa in FPA2 by B | |
928F D663 ldb <$63 | |
9291 D7AD stb <$ad | |
9293 D651 ldb <$51 | |
9295 8D12 bsr L_92A9 ; multiply mantissa in FPA2 by B | |
9297 D663 ldb <$63 | |
9299 D7AC stb <$ac | |
929B D650 ldb <$50 | |
929D 8D0E bsr L_92AD | |
929F D663 ldb <$63 | |
92A1 D7AB stb <$ab | |
92A3 BD93B6 jsr L_93B6 ; copy mantissa from $13 - $16 to FPA1 | |
92A6 7E9165 jmp L_9165 ; normalize FPA1 | |
92A9 1027FF33 L_92A9 lbeq L_91E0 ; B=0 (shift $13 - $16 & $63 right 8 bits) | |
92AD 43 L_92AD coma | |
92AE 9613 L_92AE lda <$13 | |
92B0 56 rorb | |
92B1 2726 beq L_92D9 ; RTS | |
92B3 2416 bcc L_92CB | |
92B5 9616 lda <$16 | |
92B7 9B60 adda <$60 | |
92B9 9716 sta <$16 | |
92BB 9615 lda <$15 | |
92BD 995F adca <$5f | |
92BF 9715 sta <$15 | |
92C1 9614 lda <$14 | |
92C3 995E adca <$5e | |
92C5 9714 sta <$14 | |
92C7 9613 lda <$13 | |
92C9 995D adca <$5d | |
92CB 46 L_92CB rora | |
92CC 9713 sta <$13 | |
92CE 0614 ror <$14 | |
92D0 0615 ror <$15 | |
92D2 0616 ror <$16 | |
92D4 0663 ror <$63 | |
92D6 4F clra | |
92D7 20D5 bra L_92AE | |
92D9 39 L_92D9 rts | |
92DA EC01 L_92DA ldd 1,x ; * B = exponent from FPA1 | |
92DC 9761 sta <$61 | |
92DE 8A80 ora #$80 | |
92E0 DD5D std <$5d | |
92E2 D661 ldb <$61 | |
92E4 D854 eorb <$54 | |
92E6 D762 stb <$62 | |
92E8 EC03 ldd 3,x | |
92EA DD5F std <$5f | |
92EC A684 lda ,x | |
92EE 975C sta <$5c | |
92F0 D64F ldb <$4f | |
92F2 39 rts | |
92F3 4D L_92F3 tsta ; * add A to exponent in FPA1 | |
92F4 2716 beq L_930C | |
92F6 9B4F adda <$4f | |
92F8 46 rora | |
92F9 49 rola | |
92FA 2810 bvc L_930C | |
92FC 8B80 adda #$80 | |
92FE 974F sta <$4f | |
9300 270C beq L_930E ; clear exponents in FPA1 ($4f & $54) | |
9302 9662 lda <$62 ; sign difference FPA1 / FPA2 | |
9304 9754 sta <$54 | |
9306 39 rts | |
9307 9654 L_9307 lda <$54 | |
9309 43 coma | |
930A 2002 bra L_930E | |
930C 3262 L_930C leas 2,s | |
930E 102AFE70 L_930E lbpl L_9182 ; clear exponents in FPA1 ($4f & $54) | |
9312 7E91DB do_ov_error_9312 jmp OV_error ; ?OV ERROR | |
9315 BD940A L_9315 jsr L_940A ; copy FPA1 to FPA2 | |
9318 270D beq L_9327 | |
931A 8B02 adda #$02 ; x4 | |
931C 25F4 bcs do_ov_error_9312 ; ?OV ERROR | |
931E 0F62 clr <$62 | |
9320 BD9116 jsr L_9116 ; add FPA2 to FPA1 (FPA1 exponent in A) | |
9323 0C4F inc <$4f ; double result | |
9325 27EB beq do_ov_error_9312 ; ?OV ERROR | |
9327 39 L_9327 rts | |
9328 8420000000 data_9328 fcb $84,$20,$00,$00,$00 ; FP constant 10 | |
932D BD940A L_932D jsr L_940A ; copy FPA1 to FPA2 | |
9330 8E9328 ldx #data_9328 ; FP constant 10 | |
9333 5F clrb | |
9334 D762 L_9334 stb <$62 | |
9336 BD93BF jsr MOVFM ; load variable into FPA1 (X is varptr) | |
9339 8C fcb $8c ; cmpx #DELVAR - 1 - comment byte | |
933A 8D9E L_933A bsr L_92DA ; usually skipped by comment byte | |
933C 2773 oper_div_dispatch beq D0_error ; ?/0 ERROR (FPA1 zero) | |
933E 004F neg <$4f | |
9340 8DB1 bsr L_92F3 ; add A to exponent in FPA1 | |
9342 0C4F inc <$4f | |
9344 27CC beq do_ov_error_9312 ; ?OV ERROR | |
9346 8E0013 ldx #$0013 | |
9349 C604 ldb #$04 | |
934B D703 stb <$03 | |
934D C601 ldb #$01 | |
934F 9650 L_934F lda <$50 | |
9351 915D cmpa <$5d | |
9353 2613 bne L_9368 | |
9355 9651 lda <$51 | |
9357 915E cmpa <$5e | |
9359 260D bne L_9368 | |
935B 9652 lda <$52 | |
935D 915F cmpa <$5f | |
935F 2607 bne L_9368 | |
9361 9653 lda <$53 | |
9363 9160 cmpa <$60 | |
9365 2601 bne L_9368 | |
9367 43 coma ; identical mantissas - set carry | |
9368 1FA8 L_9368 tfr cc,a | |
936A 59 rolb | |
936B 240A bcc L_9377 | |
936D E780 stb ,x+ | |
936F 0A03 dec <$03 | |
9371 2B34 bmi L_93A7 | |
9373 272E beq L_93A3 | |
9375 C601 ldb #$01 | |
9377 1F8A L_9377 tfr a,cc | |
9379 250E bcs L_9389 | |
937B 0860 L_937B lsl <$60 | |
937D 095F rol <$5f | |
937F 095E rol <$5e | |
9381 095D rol <$5d | |
9383 25E3 bcs L_9368 | |
9385 2BC8 bmi L_934F | |
9387 20DF bra L_9368 | |
9389 9660 L_9389 lda <$60 | |
938B 9053 suba <$53 | |
938D 9760 sta <$60 | |
938F 965F lda <$5f | |
9391 9252 sbca <$52 | |
9393 975F sta <$5f | |
9395 965E lda <$5e | |
9397 9251 sbca <$51 | |
9399 975E sta <$5e | |
939B 965D lda <$5d | |
939D 9250 sbca <$50 | |
939F 975D sta <$5d | |
93A1 20D8 bra L_937B | |
93A3 C640 L_93A3 ldb #$40 | |
93A5 20D0 bra L_9377 | |
93A7 56 L_93A7 rorb | |
93A8 56 rorb | |
93A9 56 rorb | |
93AA D763 stb <$63 | |
93AC 8D08 bsr L_93B6 ; copy mantissa from $13 - $16 to FPA1 | |
93AE 7E9165 jmp L_9165 ; normalize FPA1 | |
93B1 C614 D0_error ldb #$14 ; ?/0 ERROR | |
93B3 7E8344 jmp system_error ; cause error | |
93B6 9E13 L_93B6 ldx <$13 ; * copy mantissa from $13 - $16 to FPA1 | |
93B8 9F50 stx <$50 | |
93BA 9E15 ldx <$15 | |
93BC 9F52 stx <$52 | |
93BE 39 rts | |
93BF 3402 MOVFM pshs a ; * load variable into FPA1 (X is varptr) | |
93C1 EC01 ldd 1,x | |
93C3 9754 sta <$54 | |
93C5 8A80 ora #$80 | |
93C7 DD50 std <$50 | |
93C9 0F63 clr <$63 | |
93CB E684 ldb ,x | |
93CD AE03 ldx 3,x | |
93CF 9F52 stx <$52 | |
93D1 D74F stb <$4f | |
93D3 3582 puls a,pc | |
93D5 8E0045 L_93D5 ldx #$0045 ; * assign FPA1 to variable store $45 - $49 | |
93D8 2006 bra L_93E0 ; assign FPA1 to varptr in X | |
93DA 8E0040 L_93DA ldx #$0040 ; * assign FPA1 to variable store $40 - $44 | |
93DD 8C fcb $8c ; cmpx #$9e3b - comment byte | |
93DE 9E3B L_93DE ldx <$3b ; usually skipped by comment byte | |
93E0 964F L_93E0 lda <$4f ; * assign FPA1 to varptr in X | |
93E2 A784 sta ,x | |
93E4 9654 lda <$54 | |
93E6 8A7F ora #$7f | |
93E8 9450 anda <$50 | |
93EA A701 sta 1,x | |
93EC 9651 lda <$51 | |
93EE A702 sta 2,x | |
93F0 DE52 ldu <$52 | |
93F2 EF03 stu 3,x | |
93F4 39 rts | |
93F5 9661 L_93F5 lda <$61 ; * copy FPA2 to FPA1 (A = sign) | |
93F7 9754 L_93F7 sta <$54 | |
93F9 9E5C ldx <$5c | |
93FB 9F4F stx <$4f | |
93FD 0F63 clr <$63 | |
93FF 965E lda <$5e | |
9401 9751 sta <$51 | |
9403 9654 lda <$54 | |
9405 9E5F ldx <$5f | |
9407 9F52 stx <$52 | |
9409 39 rts | |
940A DC4F L_940A ldd <$4f ; * copy FPA1 to FPA2 & test for exponent = 0 | |
940C DD5C std <$5c | |
940E 9E51 ldx <$51 | |
9410 9F5E stx <$5e | |
9412 9E53 ldx <$53 | |
9414 9F60 stx <$60 | |
9416 4D tsta | |
9417 39 rts | |
9418 D64F L_9418 ldb <$4f ; * sets B to -1, 0 or 1 according to sign of FPA1 | |
941A 2708 beq L_9424 | |
941C D654 L_941C ldb <$54 | |
941E 59 L_941E rolb | |
941F C6FF ldb #$ff | |
9421 2501 bcs L_9424 | |
9423 50 negb | |
9424 39 L_9424 rts | |
9425 8DF1 SGN_dispatch bsr L_9418 ; sets B to -1, 0 or 1 as per sign of FPA1 | |
9427 D750 L_9427 stb <$50 | |
9429 0F51 clr <$51 | |
942B C688 ldb #$88 | |
942D 9650 L_942D lda <$50 | |
942F 8080 suba #$80 ; set carry according to sign | |
9431 D74F L_9431 stb <$4f | |
9433 DC8A ldd <$8a ; zero | |
9435 DD52 std <$52 | |
9437 9763 sta <$63 | |
9439 9754 sta <$54 | |
943B 7E9161 jmp L_9161 ; normalize FPA1 (if carry clear, negate 1st) | |
943E 0F54 ABS_dispatch clr <$54 ; simply clear sign byte | |
9440 39 rts | |
9441 E684 L_9441 ldb ,x ; * compare FPA1 - varptr X (set B to -1, 0 or 1) | |
9443 27D3 beq L_9418 ; sets B to -1, 0 or 1 as per sign of FPA1 | |
9445 E601 ldb 1,x | |
9447 D854 eorb <$54 | |
9449 2BD1 bmi L_941C ; set B to -1 or 1 as per sign of FPA1 | |
944B D64F L_944B ldb <$4f ; * compare FPA1 - varptr X (of same sign) | |
944D E184 cmpb ,x | |
944F 261D bne L_946E | |
9451 E601 ldb 1,x | |
9453 CA7F orb #$7f | |
9455 D450 andb <$50 | |
9457 E101 cmpb 1,x | |
9459 2613 bne L_946E | |
945B D651 ldb <$51 | |
945D E102 cmpb 2,x | |
945F 260D bne L_946E | |
9461 D652 ldb <$52 | |
9463 E103 cmpb 3,x | |
9465 2607 bne L_946E | |
9467 D653 ldb <$53 | |
9469 E004 subb 4,x | |
946B 2601 bne L_946E | |
946D 39 rts | |
946E 56 L_946E rorb ; turn carry into sign | |
946F D854 eorb <$54 | |
9471 20AB bra L_941E ; reduce B to +/- 1 | |
9473 D64F L_9473 ldb <$4f ; * denormalize FPA1 to an integer (but don't update exponent) | |
9475 273D beq L_94B4 ; clear mantissa in FPA1 | |
9477 C0A0 subb #$a0 | |
9479 9654 lda <$54 | |
947B 2A05 bpl L_9482 | |
947D 035B com <$5b | |
947F BD91C4 jsr L_91C4 ; 2's complement mantissa in FPA1 (not $54) | |
9482 8E004F L_9482 ldx #$004f ; FPA1 | |
9485 C1F8 cmpb #$f8 | |
9487 2E06 bgt L_948F | |
9489 BD91F7 jsr L_91F7 ; shift mantissa of varptr X right -B bits | |
948C 0F5B clr <$5b | |
948E 39 rts | |
948F 0F5B L_948F clr <$5b | |
9491 9654 lda <$54 | |
9493 49 rola | |
9494 0650 ror <$50 | |
9496 7E9203 jmp L_9203 ; shift mantissa of varptr X right -B bits | |
9499 D64F INT_dispach ldb <$4f ; * INT | |
949B C1A0 cmpb #$a0 ; when exponent >= $A0, no fractional part | |
949D 241D bcc L_94BC ; RTS (already an integer) | |
949F 8DD2 bsr L_9473 ; denormalize FPA1 to an integer | |
94A1 D763 stb <$63 | |
94A3 9654 lda <$54 | |
94A5 D754 stb <$54 | |
94A7 8080 suba #$80 | |
94A9 86A0 lda #$a0 | |
94AB 974F sta <$4f | |
94AD 9653 lda <$53 | |
94AF 9701 sta <$01 | |
94B1 7E9161 jmp L_9161 ; normalize FPA1 (if carry clear, negate 1st) | |
94B4 D750 L_94B4 stb <$50 ; * clear mantissa in FPA1 | |
94B6 D751 stb <$51 | |
94B8 D752 stb <$52 | |
94BA D753 stb <$53 | |
94BC 39 L_94BC rts | |
94BD 9E8A L_94BD ldx <$8a ; zero | |
94BF 9F54 stx <$54 | |
94C1 9F4F stx <$4f | |
94C3 9F51 stx <$51 | |
94C5 9F52 stx <$52 | |
94C7 9F47 stx <$47 ; $47 & $48 = decimal exponent & sign | |
94C9 9F45 stx <$45 ; $45 & $46 decimal place counter & flag | |
94CB 2567 bcs L_9534 ; read sig. figs. into FPA1 | |
94CD 8126 cmpa #$26 | |
94CF 10270748 lbeq L_9C1B ; read hex or octal | |
94D3 812D cmpa #$2d | |
94D5 2604 bne L_94DB | |
94D7 0355 com <$55 | |
94D9 2004 bra L_94DF | |
94DB 812B L_94DB cmpa #$2b | |
94DD 2604 bne L_94E3 | |
94DF 9D9F L_94DF jsr <$9f ; get next character from BASIC source | |
94E1 2551 bcs L_9534 ; read sig. figs. into FPA1 | |
94E3 812E L_94E3 cmpa #$2e | |
94E5 2728 beq L_950F | |
94E7 8145 cmpa #$45 | |
94E9 2628 bne L_9513 ; finished reading number, now finalise. | |
94EB 9D9F jsr <$9f ; get next character from BASIC source | |
94ED 2564 bcs L_9553 ; read decimal exponent into $47 | |
94EF 81C4 cmpa #$c4 ; token - | |
94F1 270E beq L_9501 | |
94F3 812D cmpa #$2d | |
94F5 270A beq L_9501 | |
94F7 81C3 cmpa #$c3 ; token + | |
94F9 2708 beq L_9503 | |
94FB 812B cmpa #$2b | |
94FD 2704 beq L_9503 | |
94FF 2006 bra L_9507 | |
9501 0348 L_9501 com <$48 | |
9503 9D9F L_9503 jsr <$9f ; get next character from BASIC source | |
9505 254C bcs L_9553 ; read decimal exponent into $47 | |
9507 0D48 L_9507 tst <$48 | |
9509 2708 beq L_9513 ; finished reading number, now finalise. | |
950B 0047 neg <$47 ; -ve exponent | |
950D 2004 bra L_9513 ; finished reading number, now finalise. | |
950F 0346 L_950F com <$46 | |
9511 26CC bne L_94DF ; 1st decimal point encountered | |
9513 9647 L_9513 lda <$47 ; * finished reading number, now finalise. | |
9515 9045 suba <$45 | |
9517 9747 sta <$47 | |
9519 2712 beq L_952D | |
951B 2A09 bpl L_9526 | |
951D BD932D L_951D jsr L_932D ; divide FPA1 by 10 | |
9520 0C47 inc <$47 | |
9522 26F9 bne L_951D | |
9524 2007 bra L_952D | |
9526 BD9315 L_9526 jsr L_9315 ; multiply FPA1 by 10 | |
9529 0A47 dec <$47 | |
952B 26F9 bne L_9526 | |
952D 9655 L_952D lda <$55 | |
952F 2A8B bpl L_94BC ; RTS | |
9531 7E96DE jmp L_96DE ; COM $54 if FPA1 non zero | |
9534 D645 L_9534 ldb <$45 ; increment decimal place counter | |
9536 D046 subb <$46 ; if decimal point passed | |
9538 D745 stb <$45 | |
953A 3402 pshs a | |
953C BD9315 jsr L_9315 ; multiply FPA1 by 10 | |
953F 3504 puls b | |
9541 C030 subb #$30 | |
9543 8D02 bsr L_9547 ; add B to FPA1 | |
9545 2098 bra L_94DF | |
9547 BD93DA L_9547 jsr L_93DA ; assign FPA1 to variable store $40 - $44 | |
954A BD9427 jsr L_9427 ; assign B to FPA1 | |
954D 8E0040 ldx #$0040 | |
9550 7E910B jmp L_910B ; add varptr X to FPA1 | |
9553 D647 L_9553 ldb <$47 ; * (note that it doesn't check for more than two digits) | |
9555 58 lslb | |
9556 58 lslb | |
9557 DB47 addb <$47 | |
9559 58 lslb ; B = 10 * $47 | |
955A 8030 suba #$30 | |
955C 3404 pshs b | |
955E ABE0 adda ,s+ | |
9560 9747 sta <$47 | |
9562 209F bra L_9503 | |
9564 9B3EBC1FFD data_9564 fcb $9b,$3e,$bc,$1f,$fd ; FP constant 99999999.9 | |
9569 9E6E6B27FD data_9569 fcb $9e,$6e,$6b,$27,$fd ; FP constant 999999999 | |
956E 9E6E6B2800 data_956E fcb $9e,$6e,$6b,$28,$00 ; FP constant 1000000000 | |
9573 8E82E5 L_9573 ldx #text_in - 1 ; * print 'IN xxxx' (current line number) | |
9576 8D0C bsr L_9584 | |
9578 DC68 ldd <$68 ; current line number | |
957A DD50 print_D std <$50 ; * print unsigned number in D | |
957C C690 ldb #$90 | |
957E 43 coma ; set carry for correct result | |
957F BD9431 jsr L_9431 ; normalize FPA1 using exponent in B | |
9582 8D03 bsr L_9587 ; convert FPA1 to string at $3DA | |
9584 7E90E5 L_9584 jmp out_string ; print string to DEVN | |
9587 CE03DA L_9587 ldu #$03da ; * convert FPA1 to string at $3DA | |
958A 8620 L_958A lda #$20 | |
958C D654 ldb <$54 | |
958E 2A02 bpl L_9592 | |
9590 862D lda #$2d | |
9592 A7C0 L_9592 sta ,u+ ; print '-' for negative numbers else space | |
9594 DF64 stu <$64 | |
9596 9754 sta <$54 | |
9598 8630 lda #$30 | |
959A D64F ldb <$4f | |
959C 102700C6 lbeq L_9666 ; number is zero | |
95A0 4F clra | |
95A1 C180 cmpb #$80 | |
95A3 2208 bhi L_95AD ; number >= 1 | |
95A5 8E956E ldx #data_956E ; FP constant 1000000000 | |
95A8 BD9273 jsr L_9273 ; multiply varptr X & FPA1 | |
95AB 86F7 lda #$f7 ; -9 | |
95AD 9745 L_95AD sta <$45 ; decimal exponent | |
95AF 8E9569 L_95AF ldx #data_9569 ; FP constant 999999999 | |
95B2 BD944B jsr L_944B ; compare FPA1 - varptr X (of same sign) | |
95B5 2E0F bgt L_95C6 | |
95B7 8E9564 L_95B7 ldx #data_9564 ; FP constant 99999999.9 | |
95BA BD944B jsr L_944B ; compare FPA1 - varptr X (of same sign) | |
95BD 2E0E bgt L_95CD ; (FPA1 is now 100000000 to 999999999) | |
95BF BD9315 jsr L_9315 ; multiply FPA1 by 10 | |
95C2 0A45 dec <$45 ; correct exponent | |
95C4 20F1 bra L_95B7 | |
95C6 BD932D L_95C6 jsr L_932D ; divide FPA1 by 10 | |
95C9 0C45 inc <$45 ; correct exponent | |
95CB 20E2 bra L_95AF | |
95CD BD90FD L_95CD jsr L_90FD ; add 0.5 to FPA1 (round it up) | |
95D0 BD9473 jsr L_9473 ; denormalize FPA1 to an integer | |
95D3 C601 ldb #$01 ; 1 digit before point for sci. notation | |
95D5 9645 lda <$45 | |
95D7 8B0A adda #$0a ; exponent now 2 more than it should be | |
95D9 2B09 bmi L_95E4 ; actual exponent < -2 (use sci. notation) | |
95DB 810B cmpa #$0b | |
95DD 2405 bcc L_95E4 ; actual exponent >= 9 (use sci. notation) | |
95DF 4A deca | |
95E0 1F89 tfr a,b ; number of digits before point = exp + 1 | |
95E2 8602 lda #$02 | |
95E4 4A L_95E4 deca | |
95E5 4A deca | |
95E6 9747 sta <$47 ; decimal exponent | |
95E8 D745 stb <$45 ; number of digits before decimal point | |
95EA 2E0D bgt L_95F9 ; no leading decimal point | |
95EC DE64 ldu <$64 | |
95EE 862E lda #$2e | |
95F0 A7C0 sta ,u+ | |
95F2 5D tstb ; can only be zero or -ve here | |
95F3 2704 beq L_95F9 ; no zero reqd after point & before 1st digit | |
95F5 8630 lda #$30 | |
95F7 A7C0 sta ,u+ | |
95F9 8E9673 L_95F9 ldx #data_9673 | |
95FC C680 ldb #$80 ; sign bit used for zero crossing logic | |
95FE 9653 L_95FE lda <$53 ; resolves a decimal digit by adding powers | |
9600 AB03 adda 3,x ; of 10 until zero is passed. | |
9602 9753 sta <$53 | |
9604 9652 lda <$52 | |
9606 A902 adca 2,x ; On 1st pass -ve values are used to get FPA1 | |
9608 9752 sta <$52 ; below zero. The digit is no. of loops - 1. | |
960A 9651 lda <$51 | |
960C A901 adca 1,x ; On 2nd pass +ve values are used to get FPA1 | |
960E 9751 sta <$51 ; above zero. The digit is 10 - no. loops. | |
9610 9650 lda <$50 | |
9612 A984 adca ,x ; This continues with alternating signs. | |
9614 9750 sta <$50 | |
9616 5C incb ; loop counter | |
9617 56 rorb ; logic to test if zero passed | |
9618 59 rolb | |
9619 28E3 bvc L_95FE | |
961B 2403 bcc L_9620 ; digit = loops - 1 | |
961D C00B subb #$0b | |
961F 50 negb | |
9620 CB2F L_9620 addb #$2f ; 1 less & ASCII conversion | |
9622 3004 leax 4,x | |
9624 1F98 tfr b,a | |
9626 847F anda #$7f ; lose sign bit | |
9628 A7C0 sta ,u+ | |
962A 0A45 dec <$45 | |
962C 2604 bne L_9632 ; haven't reached decimal point yet | |
962E 862E lda #$2e | |
9630 A7C0 sta ,u+ | |
9632 53 L_9632 comb ; alternates B between $00 & $80 | |
9633 C480 andb #$80 | |
9635 8C9697 cmpx #SQR_dispatch | |
9638 26C4 bne L_95FE | |
963A A6C2 L_963A lda ,-u ; backtrack over digits | |
963C 8130 cmpa #$30 ; until non-zero found | |
963E 27FA beq L_963A | |
9640 812E cmpa #$2e | |
9642 2602 bne L_9646 ; if no sig. figs. after decimal point | |
9644 335F leau -1,u ; then lose it. | |
9646 862B L_9646 lda #$2b | |
9648 D647 ldb <$47 | |
964A 271C beq L_9668 ; normal number (no decimal exponent) | |
964C 2A03 bpl L_9651 ; +ve exponent | |
964E 862D lda #$2d | |
9650 50 negb | |
9651 A742 L_9651 sta 2,u | |
9653 8645 lda #$45 | |
9655 A741 sta 1,u | |
9657 862F lda #$2f ; convert B to ASCII number in D | |
9659 4C L_9659 inca | |
965A C00A subb #$0a | |
965C 24FB bcc L_9659 | |
965E CB3A addb #$3a | |
9660 ED43 std 3,u | |
9662 6F45 clr 5,u ; terminate string | |
9664 2004 bra L_966A | |
9666 A7C4 L_9666 sta ,u | |
9668 6F41 L_9668 clr 1,u ; terminate string | |
966A 8E03DA L_966A ldx #$03da | |
966D 39 L_966D rts | |
966E 8000000000 data_966E fcb $80,$00,$00,$00,$00 ; FP constant 0.5 | |
9673 FA0A1F0000989680FFF0BDC0000186A0 data_9673 fcb $fa,$0a,$1f,$00,$00,$98,$96,$80,$ff,$f0,$bd,$c0,$00,$01,$86,$a0 ; -100000000 | |
9683 FFFFD8F0000003E8FFFFFF9C0000000A fcb $ff,$ff,$d8,$f0,$00,$00,$03,$e8,$ff,$ff,$ff,$9c,$00,$00,$00,$0a ; -10000 | |
9693 FFFFFFFF fcb $ff,$ff,$ff,$ff ; -1 | |
9697 BD940A SQR_dispatch jsr L_940A ; copy FPA1 to FPA2 | |
969A 8E966E ldx #data_966E ; FP constant 0.5 | |
969D BD93BF jsr MOVFM ; load variable into FPA1 (X is varptr) | |
96A0 2771 oper_pow_dispatch beq EXP_dispatch ; EXP | |
96A2 4D tsta | |
96A3 2609 bne L_96AE | |
96A5 9654 lda <$54 | |
96A7 102BFD06 lbmi D0_error ; ?/0 ERROR | |
96AB 7E9183 jmp L_9183 ; clear FPA1 exponents | |
96AE 8E004A L_96AE ldx #$004a | |
96B1 BD93E0 jsr L_93E0 ; assign FPA1 to varptr in X | |
96B4 5F clrb | |
96B5 9661 lda <$61 | |
96B7 2A10 bpl L_96C9 | |
96B9 BD9499 jsr INT_dispach ; INT | |
96BC 8E004A ldx #$004a | |
96BF 9661 lda <$61 | |
96C1 BD944B jsr L_944B ; compare FPA1 - varptr X (of same sign) | |
96C4 2603 bne L_96C9 | |
96C6 43 coma | |
96C7 D601 ldb <$01 | |
96C9 BD93F7 L_96C9 jsr L_93F7 ; copy FPA2 to FPA1 & put A in $54 | |
96CC 3404 pshs b | |
96CE BD923C jsr LOG_dispatch ; LOG | |
96D1 8E004A ldx #$004a | |
96D4 BD9273 jsr L_9273 ; multiply varptr X & FPA1 | |
96D7 8D3A bsr EXP_dispatch ; EXP | |
96D9 3502 puls a | |
96DB 46 rora | |
96DC 248F bcc L_966D ; RTS | |
96DE 964F L_96DE lda <$4f | |
96E0 2702 beq L_96E4 | |
96E2 0354 com <$54 | |
96E4 39 L_96E4 rts | |
96E5 8138AA3B29 data_96E5 fcb $81,$38,$aa,$3b,$29 ; FP constant 1/ln 2 | |
96EA 077134583E data_96EA fcb $07,$71,$34,$58,$3e ; * values appear to be error compensated | |
96EF 5674167EB31B772FEEE3857A1D841C2A fcb $56,$74,$16,$7e,$b3,$1b,$77,$2f,$ee,$e3,$85,$7a,$1d,$84,$1c,$2a | |
96FF 7C6359580A7E75FDE7C6803172181081 fcb $7c,$63,$59,$58,$0a,$7e,$75,$fd,$e7,$c6,$80,$31,$72,$18,$10,$81 ; FP constant .05550512686 (ln2)^3 / 3! | |
970F 00000000 fcb $00,$00,$00,$00 | |
9713 8E96E5 EXP_dispatch ldx #data_96E5 ; FP constant 1/ln 2 | |
9716 8D37 bsr L_974F ; multiply FPA1 by varptr X | |
9718 BD93DA jsr L_93DA ; assign FPA1 to variable store $40 - $44 | |
971B 964F lda <$4f | |
971D 8188 cmpa #$88 | |
971F 2503 bcs L_9724 | |
9721 7E9307 L_9721 jmp L_9307 ; ?OV ERROR if FPA1 +ve else FPA1 = 0 | |
9724 BD9499 L_9724 jsr INT_dispach ; INT | |
9727 9601 lda <$01 ; integer part of argument | |
9729 8B81 adda #$81 | |
972B 27F4 beq L_9721 ; ?OV ERROR | |
972D 4A deca | |
972E 3402 pshs a | |
9730 8E0040 ldx #$0040 | |
9733 BD9102 jsr L_9102 ; FPA1 = varptr X - FPA1 | |
9736 8E96EA ldx #data_96EA ; EXP coefficient table | |
9739 8D17 bsr L_9752 ; series calculation | |
973B 0F62 clr <$62 | |
973D 3502 puls a | |
973F BD92F3 jsr L_92F3 ; add A to exponent in FPA1 | |
9742 39 rts | |
9743 9F64 L_9743 stx <$64 ; * result in FPA1 | |
9745 BD93DA jsr L_93DA ; assign FPA1 to variable store $40 - $44 | |
9748 8D05 bsr L_974F ; multiply varptr X & FPA1 (x squared) | |
974A 8D08 bsr L_9754 ; calculate series | |
974C 8E0040 ldx #$0040 | |
974F 7E9273 L_974F jmp L_9273 ; multiply varptr X & FPA1 (odd powers) | |
9752 9F64 L_9752 stx <$64 ; * result in FPA1 | |
9754 BD93D5 L_9754 jsr L_93D5 ; assign FPA1 to variable store $45 - $49 | |
9757 9E64 ldx <$64 | |
9759 E680 ldb ,x+ | |
975B D755 stb <$55 | |
975D 9F64 stx <$64 | |
975F 8DEE L_975F bsr L_974F ; multiply varptr X & FPA1 | |
9761 9E64 ldx <$64 | |
9763 3005 leax 5,x | |
9765 9F64 stx <$64 | |
9767 BD910B jsr L_910B ; add varptr X to FPA1 | |
976A 8E0045 ldx #$0045 | |
976D 0A55 dec <$55 | |
976F 26EE bne L_975F | |
9771 39 rts | |
9772 BD9418 RND_dispatch jsr L_9418 ; sets B to -1, 0 or 1 as per sign of FPA1 | |
9775 2B21 bmi L_9798 | |
9777 2715 beq random_num | |
9779 8D10 bsr L_978B ; INT | |
977B BD93DA jsr L_93DA ; assign FPA1 to variable store $40 - $44 | |
977E 8D0E bsr random_num | |
9780 8E0040 ldx #$0040 | |
9783 8DCA bsr L_974F ; multiply varptr X & FPA1 | |
9785 8E920E ldx #data_920E ; FP constant 1 | |
9788 BD910B jsr L_910B ; add varptr X to FPA1 | |
978B 7E9499 L_978B jmp INT_dispach ; INT | |
978E BE0116 random_num ldx >$0116 | |
9791 9F50 stx <$50 | |
9793 BE0118 ldx >$0118 | |
9796 9F52 stx <$52 | |
9798 BE97C7 L_9798 ldx L_97C7 | |
979B 9F5D stx <$5d | |
979D BE97C9 ldx L_97C9 | |
97A0 9F5F stx <$5f | |
97A2 BD9279 jsr L_9279 ; multiply FPA1 by mantissa in FPA2 | |
97A5 DCAD ldd <$ad | |
97A7 C3658B addd #$658b | |
97AA FD0118 std >$0118 | |
97AD DD52 std <$52 | |
97AF DCAB ldd <$ab | |
97B1 C9B0 adcb #$b0 | |
97B3 8905 adca #$05 | |
97B5 FD0116 std >$0116 | |
97B8 DD50 std <$50 | |
97BA 0F54 clr <$54 | |
97BC 8680 lda #$80 | |
97BE 974F sta <$4f | |
97C0 9615 lda <$15 | |
97C2 9763 sta <$63 | |
97C4 7E9165 jmp L_9165 ; normalize FPA1 | |
97C7 40E6 L_97C7 fcb $40,$e6 ; * RND multiplier | |
97C9 4DAB L_97C9 fcb $4d,$ab | |
97CB 8E983F COS_dispatch ldx #data_983F ; FP constant pi/2 | |
97CE BD910B jsr L_910B ; add varptr X to FPA1 | |
97D1 BD940A SIN_dispatch jsr L_940A ; copy FPA1 to FPA2 | |
97D4 8E9844 ldx #data_9844 ; FP constant 2*pi | |
97D7 D661 ldb <$61 | |
97D9 BD9334 jsr L_9334 ; STB $62 & divide FPA2 by varptr X (result FPA1) | |
97DC BD940A jsr L_940A ; copy FPA1 to FPA2 | |
97DF 8DAA bsr L_978B ; INT | |
97E1 0F62 clr <$62 | |
97E3 965C lda <$5c | |
97E5 D64F ldb <$4f | |
97E7 BD9105 jsr oper_minus_dispatch ; subtract FPA1 from FPA2 (B=FPA1 exponent) | |
97EA 8E9849 ldx #data_9849 ; FP constant 0.25 | |
97ED BD9102 jsr L_9102 ; FPA1 = varptr X - FPA1 | |
97F0 9654 lda <$54 | |
97F2 3402 pshs a | |
97F4 2A09 bpl L_97FF ; angle is 1st quadrant | |
97F6 BD90FD jsr L_90FD ; add 0.5 to FPA1 | |
97F9 9654 lda <$54 | |
97FB 2B05 bmi L_9802 | |
97FD 030A com <$0a | |
97FF BD96DE L_97FF jsr L_96DE ; COM $54 if FPA1 non zero | |
9802 8E9849 L_9802 ldx #data_9849 ; FP constant 0.25 | |
9805 BD910B jsr L_910B ; add varptr X to FPA1 | |
9808 3502 puls a | |
980A 4D tsta | |
980B 2A03 bpl L_9810 | |
980D BD96DE jsr L_96DE ; COM $54 if FPA1 non zero | |
9810 8E984E L_9810 ldx #num_sin_coefficients ; series coefficients | |
9813 7E9743 L_9813 jmp L_9743 ; calculate odd power series | |
9816 BD93DA TAN_dispatch jsr L_93DA ; assign FPA1 to variable store $40 - $44 | |
9819 0F0A clr <$0a | |
981B 8DB4 bsr SIN_dispatch ; SIN | |
981D 8E004A ldx #$004a | |
9820 BD93E0 jsr L_93E0 ; assign FPA1 to varptr in X | |
9823 8E0040 ldx #$0040 | |
9826 BD93BF jsr MOVFM ; load variable into FPA1 (X is varptr) | |
9829 0F54 clr <$54 | |
982B 960A lda <$0a | |
982D 8D0C bsr L_983B ; must calculate cos | |
982F 0D4F tst <$4f | |
9831 1027F9A6 lbeq OV_error ; ?OV ERROR | |
9835 8E004A ldx #$004a | |
9838 7E933A L_9838 jmp L_933A ; FPA1 = varptr X / FPA1 | |
983B 3402 L_983B pshs a | |
983D 20C0 bra L_97FF | |
983F 81490FDAA2 data_983F fcb $81,$49,$0f,$da,$a2 ; FP constant pi/2 | |
9844 83490FDAA2 data_9844 fcb $83,$49,$0f,$da,$a2 ; FP constant 2*pi | |
9849 7F00000000 data_9849 fcb $7f,$00,$00,$00,$00 ; FP constant 0.25 | |
984E 05 num_sin_coefficients fcb $05 ; * values appear to be error compensated | |
984F 84E61A2D1B sin_coefficients fcb $84,$e6,$1a,$2d,$1b ; -((2*PI)**11)/11! / FP constant -14.38139067 -(2pi)^11 / 11! | |
9854 862807FBF8 fcb $86,$28,$07,$fb,$f8 ; ((2*PI)**9)/9! / FP constant 42.00779712 (2pi)^9 / 9! | |
9859 8799688901 fcb $87,$99,$68,$89,$01 ; -((2*PI)**7)/7! / FP constant -76.70417025 -(2pi)^7 / 7! | |
985E 872335DFE1 fcb $87,$23,$35,$df,$e1 ; ((2*PI)**5)/5! / FP constant 81.60522368 (2pi)^5 / 5! | |
9863 86A55DE728 fcb $86,$a5,$5d,$e7,$28 ; -((2*PI)**3)/3! / FP constant -41.34170211 -(2pi)^3 / 3! | |
9868 83490FDAA2 fcb $83,$49,$0f,$da,$a2 ; FP constant 2*pi / 2*PI | |
986D A154468F138F524389CD ms_easter_egg fcb $a1,$54,$46,$8f,$13,$8f,$52,$43,$89,$cd ; FP constant 7324114470 | |
9877 9654 ATN_dispatch lda <$54 ; * same result either way but series only works -1 < x <= 1 | |
9879 3402 pshs a | |
987B 2A02 bpl L_987F | |
987D 8D23 bsr L_98A2 ; COM $54 if FPA1 non zero | |
987F 964F L_987F lda <$4f | |
9881 3402 pshs a | |
9883 8181 cmpa #$81 | |
9885 2505 bcs L_988C | |
9887 8E920E ldx #data_920E ; FP constant 1 | |
988A 8DAC bsr L_9838 ; divide varptr X by FPA1 | |
988C 8E98A6 L_988C ldx #data_98A6 ; series coefficients | |
988F 8D82 bsr L_9813 ; calculate odd power series | |
9891 3502 puls a | |
9893 8181 cmpa #$81 | |
9895 2506 bcs L_989D | |
9897 8E983F ldx #data_983F ; FP constant pi/2 | |
989A BD9102 jsr L_9102 ; FPA1 = varptr X - FPA1 | |
989D 3502 L_989D puls a | |
989F 4D tsta | |
98A0 2A03 bpl L_98A5 | |
98A2 7E96DE L_98A2 jmp L_96DE ; COM $54 if FPA1 non zero | |
98A5 39 L_98A5 rts | |
98A6 0B76B383BD data_98A6 fcb $0b,$76,$b3,$83,$bd ; * values appear to be error compensated | |
98AB D3791EF4A6 fcb $d3,$79,$1e,$f4,$a6 | |
98B0 F57B83FCB0107C0C1F67CA7CDE53CBC1 fcb $f5,$7b,$83,$fc,$b0,$10,$7c,$0c,$1f,$67,$ca,$7c,$de,$53,$cb,$c1 | |
98C0 7D1464704C7DB7EA517A7D6330887E7E fcb $7d,$14,$64,$70,$4c,$7d,$b7,$ea,$51,$7a,$7d,$63,$30,$88,$7e,$7e ; FP constant .07245719654 | |
98D0 9244993A7E4CCC91C77FAAAAAA138100 fcb $92,$44,$99,$3a,$7e,$4c,$cc,$91,$c7,$7f,$aa,$aa,$aa,$13,$81,$00 | |
98E0 000000 fcb $00,$00,$00 | |
98E3 CCB844 L_98E3 ldd #$b844 ; * part of reset routine: sets up sound & graphics variables | |
98E6 DDDF std <$df ; PLAY volume data | |
98E8 8602 lda #$02 | |
98EA 97E2 sta <$e2 ; PLAY tempo | |
98EC 97DE sta <$de ; PLAY octave | |
98EE 48 lsla | |
98EF 97E1 sta <$e1 ; PLAY note length | |
98F1 0FE5 clr <$e5 ; PLAY duration | |
98F3 DC8A ldd <$8a ; zero | |
98F5 DDE8 std <$e8 ; DRAW angle | |
98F7 C680 ldb #$80 | |
98F9 DDC7 std <$c7 ; graphics X | |
98FB C660 ldb #$60 | |
98FD DDC9 std <$c9 ; graphics Y | |
98FF 39 L_98FF rts | |
9900 9D9F L_9900 jsr <$9f ; get next character from BASIC source | |
9902 BDB7AA jsr L_B7AA ; get filename | |
9905 8D43 bsr L_994A ; get start address | |
9907 BF01E7 stx >$01e7 | |
990A 8D3E bsr L_994A ; get end address | |
990C AC62 cmpx 2,s | |
990E 1025F27B lbcs FC_error ; ?FC ERROR | |
9912 8D36 bsr L_994A ; get entry address | |
9914 BF01E5 stx >$01e5 | |
9917 9DA5 jsr <$a5 ; get current character from BASIC source | |
9919 26E4 bne L_98FF | |
991B 8602 lda #$02 ; file type = 2 = binary | |
991D 9E8A ldx <$8a ; non-ASCII & ungapped | |
991F BDB891 jsr L_B891 ; write filename block | |
9922 0F78 clr <$78 ; cassette status | |
9924 0C7C inc <$7c ; block type | |
9926 BD801B jsr call_WRTLDR ; write leader | |
9929 AE64 ldx 4,s | |
992B 9F7E L_992B stx <$7e ; IO buffer | |
992D 86FF lda #$ff | |
992F 977D sta <$7d ; block length | |
9931 EC62 ldd 2,s | |
9933 937E subd <$7e ; IO buffer | |
9935 2405 bcc L_993C | |
9937 3266 leas 6,s | |
9939 7EB6CD jmp L_B6CD ; NEG $7c CLR $7d & write last block | |
993C 108300FF L_993C cmpd #$00ff | |
9940 2403 bcc L_9945 | |
9942 5C incb | |
9943 D77D stb <$7d ; block length | |
9945 BDB999 L_9945 jsr BLKOUT ; write block to tape | |
9948 20E1 bra L_992B | |
994A BD89AA L_994A jsr CkComa ; skip comma | |
994D BD8E83 jsr Get16Bit ; read 16 bit number into X | |
9950 EEE4 ldu ,s | |
9952 AFE4 stx ,s | |
9954 1F35 tfr u,pc | |
9956 BD9418 FIX_dispatch jsr L_9418 ; sets B to -1, 0 or 1 as per sign of FPA1 | |
9959 2B03 bmi L_995E | |
995B 7E9499 L_995B jmp INT_dispach ; INT | |
995E 0354 L_995E com <$54 | |
9960 8DF9 bsr L_995B | |
9962 7E96DE jmp L_96DE ; COM $54 if FPA1 non zero | |
9965 BD9D9F EDIT_dispatch jsr L_9D9F ; get line number in $2b | |
9968 3262 leas 2,s ; lose return address | |
996A 8601 L_996A lda #$01 | |
996C 97D8 sta <$d8 | |
996E BD83FF jsr basic_line_after_2b ; search program for line number in <$2b | |
9971 1025EC90 lbcs UL_error ; ?UL ERROR | |
9975 BD8F08 jsr L_8F08 ; detokenize BASIC line | |
9978 1F20 tfr y,d | |
997A 8302DE subd #$02de | |
997D D7D7 stb <$d7 ; line length | |
997F DC2B L_997F ldd <$2b | |
9981 BD957A jsr print_D ; print unsigned number in D | |
9984 BD90F5 jsr L_90F5 ; print a space to DEVN | |
9987 8E02DD ldx #$02dd | |
998A D6D8 ldb <$d8 | |
998C 2625 bne L_99B3 ; print entire line | |
998E 5F L_998E clrb | |
998F BD9AB9 L_998F jsr L_9AB9 ; read keys (carry clear if control key) | |
9992 BDA438 jsr L_A438 ; set carry if A is non-numeric character | |
9995 250B bcs L_99A2 | |
9997 8030 suba #$30 ; accumulate typed digits in B | |
9999 3402 pshs a | |
999B 860A lda #$0a | |
999D 3D mul | |
999E EBE0 addb ,s+ | |
99A0 20ED bra L_998F | |
99A2 C001 L_99A2 subb #$01 | |
99A4 C901 adcb #$01 | |
99A6 8141 cmpa #$41 ; (A = abandon changes & start again) | |
99A8 2605 bne L_99AF | |
99AA BD90A1 jsr print_CR ; send CR to DEVN | |
99AD 20BB bra L_996A | |
99AF 814C L_99AF cmpa #$4c ; (L = show line in current state) | |
99B1 260B bne L_99BE | |
99B3 8D31 L_99B3 bsr L_99E6 ; output ASCIIZ string to DEVN (X is pointer) | |
99B5 0FD8 clr <$d8 | |
99B7 BD90A1 jsr print_CR ; send CR to DEVN | |
99BA 20C3 bra L_997F | |
99BC 3262 L_99BC leas 2,s ; lose return address | |
99BE 810D L_99BE cmpa #$0d ; (RETURN = save changes, show line & quit) | |
99C0 260D bne L_99CF | |
99C2 8D22 bsr L_99E6 ; output ASCIIZ string to DEVN (X is pointer) | |
99C4 BD90A1 L_99C4 jsr print_CR ; send CR to DEVN | |
99C7 8E02DD ldx #$02dd | |
99CA 9FA6 stx <$a6 ; BASIC source pointer | |
99CC 7E83A6 jmp L_83A6 ; enter BASIC line | |
99CF 8145 L_99CF cmpa #$45 ; (E = save changes & quit) | |
99D1 27F1 beq L_99C4 | |
99D3 8151 cmpa #$51 ; (Q = discard changes & quit) | |
99D5 2606 bne L_99DD | |
99D7 BD90A1 jsr print_CR ; send CR to DEVN | |
99DA 7E8371 jmp goto_ok_prompt ; command mode | |
99DD 8D02 L_99DD bsr L_99E1 | |
99DF 20AD bra L_998E | |
99E1 8120 L_99E1 cmpa #$20 ; (SPACE = show more characters) | |
99E3 2610 bne L_99F5 | |
99E5 8C fcb $8c ; cmpx #$c6f9 - comment byte | |
99E6 C6F9 L_99E6 ldb #$f9 ; usually skipped by comment byte | |
99E8 A684 L_99E8 lda ,x ; * (99E6 C6F9 LDB #$F9) | |
99EA 2708 beq L_99F4 | |
99EC BDB54A jsr OUTCHR ; output character to DEVN | |
99EF 3001 leax 1,x | |
99F1 5A decb | |
99F2 26F4 bne L_99E8 ; show another (in EDIT context) | |
99F4 39 L_99F4 rts | |
99F5 8144 L_99F5 cmpa #$44 ; (D = delete a number of characters) | |
99F7 2648 bne L_9A41 | |
99F9 6D84 L_99F9 tst ,x | |
99FB 27F7 beq L_99F4 | |
99FD 8D04 bsr L_9A03 ; close line up over removed character | |
99FF 5A decb | |
9A00 26F7 bne L_99F9 | |
9A02 39 rts | |
9A03 0AD7 L_9A03 dec <$d7 ; * EDIT: close line up over removed character | |
9A05 311F leay -1,x | |
9A07 3121 L_9A07 leay 1,y | |
9A09 A621 lda 1,y | |
9A0B A7A4 sta ,y | |
9A0D 26F8 bne L_9A07 | |
9A0F 39 rts | |
9A10 8149 L_9A10 cmpa #$49 ; (I = insert mode) | |
9A12 2713 beq L_9A27 | |
9A14 8158 cmpa #$58 ; (X = insert mode at end of line) | |
9A16 270D beq L_9A25 | |
9A18 8148 cmpa #$48 ; (H = wipe rest of line & insert) | |
9A1A 265C bne L_9A78 | |
9A1C 6F84 clr ,x | |
9A1E 1F10 tfr x,d | |
9A20 8302DE subd #$02de | |
9A23 D7D7 stb <$d7 ; updated line length | |
9A25 8DBF L_9A25 bsr L_99E6 ; output ASCIIZ string to DEVN (X is pointer) | |
9A27 BD9AB9 L_9A27 jsr L_9AB9 ; read keys (carry clear if control key) | |
9A2A 810D cmpa #$0d | |
9A2C 278E beq L_99BC ; RETURN | |
9A2E 811B cmpa #$1b | |
9A30 2725 beq L_9A57 ; RTS (escape insert mode) | |
9A32 8108 cmpa #$08 | |
9A34 2622 bne L_9A58 ; not backspace | |
9A36 8C02DD cmpx #$02dd | |
9A39 27EC beq L_9A27 ; nothing to delete | |
9A3B 8D45 bsr L_9A82 ; delete it on screen | |
9A3D 8DC4 bsr L_9A03 ; delete it in memory | |
9A3F 20E6 bra L_9A27 | |
9A41 8143 L_9A41 cmpa #$43 ; (C = change a number of characters) | |
9A43 26CB bne L_9A10 | |
9A45 6D84 L_9A45 tst ,x | |
9A47 270E beq L_9A57 ; RTS | |
9A49 BD9AB9 jsr L_9AB9 ; read keys (carry clear if control key) | |
9A4C 2502 bcs L_9A50 | |
9A4E 20F5 bra L_9A45 | |
9A50 A780 L_9A50 sta ,x+ | |
9A52 8D37 bsr L_9A8B ; output character to DEVN | |
9A54 5A decb | |
9A55 26EE bne L_9A45 ; change another | |
9A57 39 L_9A57 rts | |
9A58 D6D7 L_9A58 ldb <$d7 ; * EDIT: typed characters in insert mode | |
9A5A C1F9 cmpb #$f9 | |
9A5C 2602 bne L_9A60 | |
9A5E 20C7 bra L_9A27 ; line full | |
9A60 3410 L_9A60 pshs x | |
9A62 6D80 L_9A62 tst ,x+ ; create a space for character | |
9A64 26FC bne L_9A62 | |
9A66 E682 L_9A66 ldb ,-x | |
9A68 E701 stb 1,x | |
9A6A ACE4 cmpx ,s | |
9A6C 26F8 bne L_9A66 | |
9A6E 3262 leas 2,s | |
9A70 A780 sta ,x+ | |
9A72 8D17 bsr L_9A8B ; output character to DEVN | |
9A74 0CD7 inc <$d7 | |
9A76 20AF bra L_9A27 | |
9A78 8108 L_9A78 cmpa #$08 ; * EDIT: backspace over a number of characters | |
9A7A 2612 bne L_9A8E | |
9A7C 8D04 L_9A7C bsr L_9A82 | |
9A7E 5A decb | |
9A7F 26FB bne L_9A7C ; backspace again | |
9A81 39 rts | |
9A82 8C02DD L_9A82 cmpx #$02dd ; * EDIT: backspace | |
9A85 27D0 beq L_9A57 ; RTS | |
9A87 301F leax -1,x | |
9A89 8608 lda #$08 | |
9A8B 7EB54A L_9A8B jmp OUTCHR ; output character to DEVN | |
9A8E 814B L_9A8E cmpa #$4b ; (K = wipe chrs until nth occurrence of chr) | |
9A90 2705 beq L_9A97 | |
9A92 8053 suba #$53 ; (S = search for nth occurrence of chr) | |
9A94 2701 beq L_9A97 | |
9A96 39 rts | |
9A97 3402 L_9A97 pshs a ; * EDIT: search functions | |
9A99 8D1E bsr L_9AB9 ; read keys (carry clear if control key) | |
9A9B 3402 pshs a | |
9A9D A684 L_9A9D lda ,x | |
9A9F 2716 beq L_9AB7 ; PULS Y,PC | |
9AA1 6D61 tst 1,s | |
9AA3 2606 bne L_9AAB ; Kill (not Search) | |
9AA5 8DE4 bsr L_9A8B ; output character to DEVN | |
9AA7 3001 leax 1,x | |
9AA9 2003 bra L_9AAE | |
9AAB BD9A03 L_9AAB jsr L_9A03 ; close line up over removed character | |
9AAE A684 L_9AAE lda ,x | |
9AB0 A1E4 cmpa ,s | |
9AB2 26E9 bne L_9A9D ; not found | |
9AB4 5A decb | |
9AB5 26E6 bne L_9A9D ; find next occurrence | |
9AB7 35A0 L_9AB7 puls y,pc | |
9AB9 BDB505 L_9AB9 jsr L_B505 ; read character from DEVN & strip MSB | |
9ABC 817F cmpa #$7f | |
9ABE 24F9 bcc L_9AB9 ; pointless test! | |
9AC0 815F cmpa #$5f | |
9AC2 2602 bne L_9AC6 ; not shift + CU | |
9AC4 861B lda #$1b | |
9AC6 810D L_9AC6 cmpa #$0d | |
9AC8 270E beq L_9AD8 ; return | |
9ACA 811B cmpa #$1b | |
9ACC 270A beq L_9AD8 ; escape | |
9ACE 8108 cmpa #$08 | |
9AD0 2706 beq L_9AD8 ; backspace | |
9AD2 8120 cmpa #$20 | |
9AD4 25E3 bcs L_9AB9 ; illegal | |
9AD6 1A01 orcc #$01 | |
9AD8 39 L_9AD8 rts | |
9AD9 86 TRON_dispatch fcb $86 ; lda #$4f - comment byte / * TRON | |
9ADA 4F TROFF_dispatch clra ; usually skipped by comment byte | |
9ADB 97AF sta <$af ; * (9ADA 4F CLRA) | |
9ADD 39 rts | |
9ADE 966F POS_dispatch lda <$6f ; DEVN | |
9AE0 3402 pshs a | |
9AE2 BDB7E0 jsr L_B7E0 ; load DEVN from FPA1 | |
9AE5 BDB63C jsr L_B63C ; if DEVN = -1, test cassette OK for output | |
9AE8 BDB595 jsr L_B595 ; initialise virtual DEVN device | |
9AEB D66C ldb <$6c ; device current column | |
9AED 3502 puls a | |
9AEF 976F sta <$6f ; DEVN | |
9AF1 7E8C36 jmp Assign8Bit ; assign B to FPA1 | |
9AF4 BD89A7 VARPTR_dispatch jsr CkOpBrak ; skip open bracket | |
9AF7 DC1F ldd <$1f ; end of BASIC storage | |
9AF9 3406 pshs a,b | |
9AFB BD8A94 jsr GETVAR ; get varptr of variable in X | |
9AFE BD89A4 jsr CkClBrak ; skip close bracket | |
9B01 3506 puls a,b | |
9B03 1E10 exg x,d | |
9B05 9C1F cmpx <$1f ; not allowed to create new variable | |
9B07 2651 bne do_fc_error_9B5A ; ?FC ERROR | |
9B09 7E9FD0 jmp varptr_patch ; assign D to FPA1 | |
9B0C 9D9F LET_MIDstr_handler jsr <$9f ; get next character from BASIC source | |
9B0E BD89A7 jsr CkOpBrak ; skip open bracket | |
9B11 BD8A94 jsr GETVAR ; get varptr of variable in X | |
9B14 3410 pshs x | |
9B16 EC02 ldd 2,x | |
9B18 109321 cmpd <$21 ; stack root / string storage start | |
9B1B 2304 bls L_9B21 | |
9B1D 9327 subd <$27 ; top of BASIC RAM | |
9B1F 2312 bls L_9B33 | |
9B21 E684 L_9B21 ldb ,x | |
9B23 BD8CB3 jsr L_8CB3 ; reserve B bytes of string space | |
9B26 3410 pshs x | |
9B28 AE62 ldx 2,s | |
9B2A BD8D89 jsr L_8D89 ; copy string (len B) from varptr X to ($25)+ | |
9B2D 3550 puls x,u | |
9B2F AF42 stx 2,u | |
9B31 3440 pshs u | |
9B33 BD8E7E L_9B33 jsr L_8E7E | |
9B36 3404 pshs b | |
9B38 5D tstb | |
9B39 271F beq do_fc_error_9B5A ; ?FC ERROR | |
9B3B C6FF ldb #$ff | |
9B3D 8129 cmpa #$29 | |
9B3F 2703 beq L_9B44 | |
9B41 BD8E7E jsr L_8E7E | |
9B44 3404 L_9B44 pshs b | |
9B46 BD89A4 jsr CkClBrak ; skip close bracket | |
9B49 C6CB ldb #$cb | |
9B4B BD89AC jsr CkChar ; skip character in B | |
9B4E 8D2E bsr L_9B7E ; get string expression & point X to it | |
9B50 1F13 tfr x,u | |
9B52 AE62 ldx 2,s | |
9B54 A684 lda ,x | |
9B56 A061 suba 1,s | |
9B58 2403 bcc L_9B5D | |
9B5A 7E8B8D do_fc_error_9B5A jmp FC_error ; ?FC ERROR | |
9B5D 4C L_9B5D inca | |
9B5E A1E4 cmpa ,s | |
9B60 2402 bcc L_9B64 | |
9B62 A7E4 sta ,s | |
9B64 A661 L_9B64 lda 1,s | |
9B66 1E89 exg a,b | |
9B68 AE02 ldx 2,x | |
9B6A 5A decb | |
9B6B 3A abx | |
9B6C 4D tsta | |
9B6D 270D beq L_9B7C | |
9B6F A1E4 cmpa ,s | |
9B71 2302 bls L_9B75 | |
9B73 A6E4 lda ,s | |
9B75 1F89 L_9B75 tfr a,b | |
9B77 1E31 exg u,x | |
9B79 BDB7CC jsr L_B7CC ; copy B bytes from X to U | |
9B7C 3596 L_9B7C puls a,b,x,pc | |
9B7E BD8887 L_9B7E jsr get_string ; get expression | |
9B81 7E8D9A jmp L_8D9A ; validate string & point X to it (B=len) | |
9B84 BD89A7 STRINGstr_dispatch jsr CkOpBrak ; skip open bracket | |
9B87 BD8E51 jsr Get8Bit ; get number into B | |
9B8A 3404 pshs b | |
9B8C BD89AA jsr CkComa ; skip comma | |
9B8F BD8887 jsr get_string ; get expression | |
9B92 BD89A4 jsr CkClBrak ; skip close bracket | |
9B95 9606 lda <$06 ; numeric / string flag | |
9B97 2605 bne L_9B9E | |
9B99 BD8E54 jsr L_8E54 ; read 8 bit value into B from FPA1 | |
9B9C 2003 bra L_9BA1 | |
9B9E BD8DEA L_9B9E jsr L_8DEA ; get 1st character of string into B | |
9BA1 3404 L_9BA1 pshs b | |
9BA3 E661 ldb 1,s ; number of copies | |
9BA5 BD8C52 jsr L_8C52 ; reserve B bytes of string space | |
9BA8 3506 puls a,b | |
9BAA 2705 beq L_9BB1 | |
9BAC A780 L_9BAC sta ,x+ | |
9BAE 5A decb | |
9BAF 26FB bne L_9BAC | |
9BB1 7E8DE1 L_9BB1 jmp L_8DE1 | |
9BB4 BD89A7 INSTR_dispatch jsr CkOpBrak ; skip open bracket | |
9BB7 BD8887 jsr get_string ; get expression | |
9BBA C601 ldb #$01 ; default start position | |
9BBC 3404 pshs b | |
9BBE 9606 lda <$06 ; numeric / string flag | |
9BC0 2610 bne L_9BD2 ; start pos not specified | |
9BC2 BD8E54 jsr L_8E54 ; read 8 bit value into B from FPA1 | |
9BC5 E7E4 stb ,s | |
9BC7 2791 beq do_fc_error_9B5A ; ?FC ERROR | |
9BC9 BD89AA jsr CkComa ; skip comma | |
9BCC BD8887 jsr get_string ; get expression | |
9BCF BD8877 jsr get_expr ; validate string expression | |
9BD2 9E52 L_9BD2 ldx <$52 | |
9BD4 3410 pshs x | |
9BD6 BD89AA jsr CkComa ; skip comma | |
9BD9 BD9B7E jsr L_9B7E ; get string expression & point X to it | |
9BDC 3414 pshs b,x | |
9BDE BD89A4 jsr CkClBrak ; skip close bracket | |
9BE1 AE63 ldx 3,s ; varptr of main string | |
9BE3 BD8D9F jsr DELVAR ; point X to string & length in B | |
9BE6 3404 pshs b | |
9BE8 E166 cmpb 6,s | |
9BEA 2523 bcs L_9C0F ; main string is shorter than start pos | |
9BEC A661 lda 1,s ; target string length | |
9BEE 271C beq L_9C0C | |
9BF0 E666 ldb 6,s ; start pos | |
9BF2 5A decb | |
9BF3 3A abx | |
9BF4 3184 L_9BF4 leay ,x ; Y = X = position to start search | |
9BF6 EE62 ldu 2,s ; U -> target characters | |
9BF8 E661 ldb 1,s ; B = target length | |
9BFA A6E4 lda ,s ; A = main string length | |
9BFC A066 suba 6,s | |
9BFE 4C inca ; A = A - start pos + 1 | |
9BFF A161 cmpa 1,s | |
9C01 250C bcs L_9C0F ; remaining length is shorter than target | |
9C03 A680 L_9C03 lda ,x+ | |
9C05 A1C0 cmpa ,u+ | |
9C07 260C bne L_9C15 ; didn't match | |
9C09 5A decb | |
9C0A 26F7 bne L_9C03 ; test next character in target | |
9C0C E666 L_9C0C ldb 6,s ; found it | |
9C0E 21 fcb $21 ; brn L_9C6F - comment byte | |
9C0F 5F L_9C0F clrb ; usually skipped by comment byte | |
9C10 3267 leas 7,s ; * (9C0F 5F CLRB) | |
9C12 7E8C36 jmp Assign8Bit ; assign B to FPA1 | |
9C15 6C66 L_9C15 inc 6,s | |
9C17 3021 leax 1,y ; advance start pos & try again | |
9C19 20D9 bra L_9BF4 | |
9C1B 0F52 L_9C1B clr <$52 ; * read octal or hex number from command into $52 / $53 | |
9C1D 0F53 clr <$53 | |
9C1F 8E0052 ldx #$0052 | |
9C22 9D9F jsr <$9f ; get next character from BASIC source | |
9C24 814F cmpa #$4f | |
9C26 2712 beq L_9C3A | |
9C28 8148 cmpa #$48 | |
9C2A 2723 beq L_9C4F | |
9C2C 9DA5 jsr <$a5 ; get current character from BASIC source | |
9C2E 200C bra L_9C3C | |
9C30 8138 L_9C30 cmpa #$38 | |
9C32 1022ED7E lbhi SN_error ; ?SN ERROR | |
9C36 C603 ldb #$03 | |
9C38 8D2A bsr L_9C64 ; shift word at ,X left B bits | |
9C3A 9D9F L_9C3A jsr <$9f ; get next character from BASIC source | |
9C3C 25F2 L_9C3C bcs L_9C30 | |
9C3E 0F50 Assign16BitB clr <$50 ; * assign contents of $52 / $53 to FPA1 | |
9C40 0F51 clr <$51 | |
9C42 0F06 clr <$06 ; numeric / string flag | |
9C44 0F63 clr <$63 | |
9C46 0F54 clr <$54 | |
9C48 C6A0 ldb #$a0 | |
9C4A D74F stb <$4f | |
9C4C 7E9165 jmp L_9165 ; normalize FPA1 | |
9C4F 9D9F L_9C4F jsr <$9f ; get next character from BASIC source | |
9C51 250B bcs L_9C5E | |
9C53 BD8ADF jsr L_8ADF ; carry clear if A-Z | |
9C56 25E6 bcs Assign16BitB ; assign contents of $52 / $53 to FPA1 | |
9C58 8147 cmpa #$47 | |
9C5A 24E2 bcc Assign16BitB ; assign contents of $52 / $53 to FPA1 | |
9C5C 8007 suba #$07 | |
9C5E C604 L_9C5E ldb #$04 | |
9C60 8D02 bsr L_9C64 ; shift word at ,X left B bits | |
9C62 20EB bra L_9C4F | |
9C64 6801 L_9C64 lsl 1,x ; * shift word at ,X left B bits | |
9C66 6984 rol ,x | |
9C68 1025F56F lbcs OV_error ; ?OV ERROR | |
9C6C 5A decb | |
9C6D 26F5 bne L_9C64 | |
9C6F 8030 L_9C6F suba #$30 | |
9C71 AB01 adda 1,x | |
9C73 A701 sta 1,x | |
9C75 39 L_9C75 rts | |
9C76 9E68 ensure_not_direct ldx <$68 ; current line number | |
9C78 3001 leax 1,x | |
9C7A 26F9 bne L_9C75 ; not in command mode | |
9C7C C616 ldb #$16 ; ?ID ERROR | |
9C7E 7E8344 L_9C7E jmp system_error ; cause error | |
9C81 AE9F00A6 DEF_dispatch ldx [$00a6] ; * DEF | |
9C85 8CFFA1 cmpx #$ffa1 ; DEF USR | |
9C88 10270074 lbeq L_9D00 | |
9C8C 8D23 bsr L_9CB1 | |
9C8E 8DE6 bsr ensure_not_direct ; test for command mode | |
9C90 BD89A7 jsr CkOpBrak ; skip open bracket | |
9C93 C680 ldb #$80 | |
9C95 D708 stb <$08 ; array illegal flag | |
9C97 BD8A94 jsr GETVAR ; get varptr of variable in X | |
9C9A 8D25 bsr L_9CC1 | |
9C9C BD89A4 jsr CkClBrak ; skip close bracket | |
9C9F C6CB ldb #$cb | |
9CA1 BD89AC jsr CkChar ; skip character in B | |
9CA4 9E4B ldx <$4b | |
9CA6 DCA6 ldd <$a6 ; BASIC source pointer | |
9CA8 ED84 std ,x | |
9CAA DC39 ldd <$39 | |
9CAC ED02 std 2,x | |
9CAE 7E8613 jmp DATA_dispatch ; skip to start of next statement | |
9CB1 C6BE L_9CB1 ldb #$be ; token FN | |
9CB3 BD89AC jsr CkChar ; skip character in B | |
9CB6 C680 ldb #$80 | |
9CB8 D708 stb <$08 ; array illegal flag | |
9CBA 8A80 ora #$80 | |
9CBC BD8A99 jsr L_8A99 | |
9CBF 9F4B stx <$4b | |
9CC1 7E8874 L_9CC1 jmp L_8874 ; validate numeric expression | |
9CC4 8DEB L_9CC4 bsr L_9CB1 | |
9CC6 3410 pshs x | |
9CC8 BD899F jsr L_899F ; get expression inside brackets | |
9CCB 8DF4 bsr L_9CC1 | |
9CCD 3540 puls u | |
9CCF C622 ldb #$22 ; ?UF ERROR | |
9CD1 AE42 ldx 2,u | |
9CD3 27A9 beq L_9C7E ; cause error | |
9CD5 109EA6 ldy <$a6 ; BASIC source pointer | |
9CD8 EEC4 ldu ,u | |
9CDA DFA6 stu <$a6 ; BASIC source pointer | |
9CDC A604 lda 4,x | |
9CDE 3402 pshs a | |
9CE0 EC84 ldd ,x | |
9CE2 EE02 ldu 2,x | |
9CE4 3476 pshs a,b,x,y,u | |
9CE6 BD93E0 jsr L_93E0 ; assign FPA1 to varptr in X | |
9CE9 BD8872 jsr L_8872 ; read numeric expression into FPA1 | |
9CEC 3576 puls a,b,x,y,u | |
9CEE ED84 std ,x | |
9CF0 EF02 stu 2,x | |
9CF2 3502 puls a | |
9CF4 A704 sta 4,x | |
9CF6 9DA5 jsr <$a5 ; get current character from BASIC source | |
9CF8 1026ECB8 lbne SN_error ; ?SN ERROR | |
9CFC 109FA6 sty <$a6 ; BASIC source pointer | |
9CFF 39 rts | |
9D00 9D9F L_9D00 jsr <$9f ; get next character from BASIC source | |
9D02 9D9F jsr <$9f ; get next character from BASIC source | |
9D04 8D07 bsr L_9D0D | |
9D06 3410 pshs x | |
9D08 8D2B bsr L_9D35 | |
9D0A AFF1 stx [,s++] | |
9D0C 39 rts | |
9D0D 5F L_9D0D clrb ; * called by USR: converts following digit into USR table pointer | |
9D0E 9DA5 jsr <$a5 ; get current character from BASIC source | |
9D10 2406 bcc L_9D18 | |
9D12 8030 suba #$30 | |
9D14 1F89 tfr a,b | |
9D16 9D9F jsr <$9f ; get next character from BASIC source | |
9D18 9EB0 L_9D18 ldx <$b0 ; address of USR table | |
9D1A 58 lslb | |
9D1B 3A abx | |
9D1C 39 rts | |
9D1D 8DEE USR_dispatch bsr L_9D0D ; * USRx | |
9D1F AE84 ldx ,x | |
9D21 3410 pshs x | |
9D23 BD899F jsr L_899F ; get expression inside brackets | |
9D26 8E004F ldx #$004f ; FPA1 | |
9D29 9606 lda <$06 ; numeric / string flag | |
9D2B 2707 beq L_9D34 | |
9D2D BD8D9D jsr L_8D9D ; point X to string just compiled & len in B | |
9D30 9E52 ldx <$52 | |
9D32 9606 lda <$06 ; numeric / string flag | |
9D34 39 L_9D34 rts | |
9D35 C6CB L_9D35 ldb #$cb ; token = | |
9D37 BD89AC jsr CkChar ; skip character in B | |
9D3A 7E8E83 jmp Get16Bit ; read 16 bit number into X | |
9D3D B6FF03 IRQ_service lda >$ff03 ; * IRQ service routine | |
9D40 2B01 bmi L_9D43 ; vsync | |
9D42 3B rti | |
9D43 B6FF02 L_9D43 lda >$ff02 | |
9D46 BE0112 ldx >$0112 ; TIMER value | |
9D49 3001 leax 1,x | |
9D4B BF0112 stx >$0112 | |
9D4E 7EAFD9 jmp L_AFD9 ; ...continued | |
9D51 9D9F LET_TIMER_handler jsr <$9f ; get next character from BASIC source | |
9D53 8DE0 bsr L_9D35 | |
9D55 BF0112 stx >$0112 ; TIMER value | |
9D58 39 rts | |
9D59 BE0112 TIMER_dispatch ldx >$0112 ; TIMER value | |
9D5C 9F52 stx <$52 | |
9D5E 7E9C3E jmp Assign16BitB ; assign contents of $52 / $53 to FPA1 | |
9D61 1027EE28 DEL_dispatch lbeq FC_error ; ?FC ERROR | |
9D65 BD869A jsr L_869A ; read line number & store in $2b | |
9D68 BD83FF jsr basic_line_after_2b ; search program for line number in <$2b | |
9D6B 9FD3 stx <$d3 | |
9D6D 9DA5 jsr <$a5 ; get current character from BASIC source | |
9D6F 2710 beq L_9D81 | |
9D71 81C4 cmpa #$c4 ; token - | |
9D73 263B bne L_9DB0 | |
9D75 9D9F jsr <$9f ; get next character from BASIC source | |
9D77 2704 beq L_9D7D | |
9D79 8D24 bsr L_9D9F | |
9D7B 2004 bra L_9D81 | |
9D7D 86FF L_9D7D lda #$ff | |
9D7F 972B sta <$2b | |
9D81 DED3 L_9D81 ldu <$d3 | |
9D83 8C fcb $8c ; cmpx #$eec4 - comment byte | |
9D84 EEC4 L_9D84 ldu ,u ; usually skipped by comment byte | |
9D86 ECC4 ldd ,u ; * (9D84 EEC4 LDU ,U) | |
9D88 2706 beq L_9D90 | |
9D8A EC42 ldd 2,u | |
9D8C 932B subd <$2b | |
9D8E 23F4 bls L_9D84 | |
9D90 9ED3 L_9D90 ldx <$d3 | |
9D92 8D15 bsr L_9DA9 ; move program down from U to X | |
9D94 BD841F jsr BasVect1 ; clear variables and reset stack & cmd ptr | |
9D97 9ED3 ldx <$d3 | |
9D99 BD83EF jsr L_83EF ; set up next line pointers from X onwards | |
9D9C 7E8371 jmp goto_ok_prompt ; command mode | |
9D9F BD869A L_9D9F jsr L_869A ; read line number & store in $2b | |
9DA2 7EB7F9 jmp L_B7F9 ; cause error if next byte is not zero | |
9DA5 A6C0 L_9DA5 lda ,u+ | |
9DA7 A780 sta ,x+ | |
9DA9 11931B L_9DA9 cmpu <$1b ; start of simple variables | |
9DAC 26F7 bne L_9DA5 | |
9DAE 9F1B stx <$1b ; start of simple variables | |
9DB0 39 L_9DB0 rts | |
9DB1 BD9C76 LINE_INPUT_handler jsr ensure_not_direct ; test for command mode | |
9DB4 9D9F jsr <$9f ; get next character from BASIC source | |
9DB6 8123 cmpa #$23 | |
9DB8 2609 bne L_9DC3 | |
9DBA BDB7D7 jsr L_B7D7 ; read #-n & set up DEVN | |
9DBD BDB623 jsr L_B623 ; test cassette status OK for input | |
9DC0 BD89AA jsr CkComa ; skip comma | |
9DC3 8122 L_9DC3 cmpa #$22 | |
9DC5 260B bne L_9DD2 ; no prompt | |
9DC7 BD8975 jsr L_8975 ; read literal string | |
9DCA C63B ldb #$3b | |
9DCC BD89AC jsr CkChar ; skip character in B | |
9DCF BD90E8 jsr L_90E8 ; print string just compiled | |
9DD2 327E L_9DD2 leas -2,s | |
9DD4 BD8766 jsr L_8766 | |
9DD7 3262 leas 2,s | |
9DD9 0F6F clr <$6f ; DEVN | |
9DDB BD8A94 jsr GETVAR ; get varptr of variable in X | |
9DDE 9F3B stx <$3b | |
9DE0 BD8877 jsr get_expr ; validate string expression | |
9DE3 8E02DC ldx #$02dc | |
9DE6 4F clra | |
9DE7 BD8C5D jsr L_8C5D ; compile literal string at X | |
9DEA 7E86D7 jmp L_86D7 ; assign string variable | |
9DED BD869A L_9DED jsr L_869A ; read line number & store in $2b | |
9DF0 9E2B ldx <$2b | |
9DF2 39 rts | |
9DF3 9ED1 L_9DF3 ldx <$d1 ; * RENUM: search for start line | |
9DF5 9F2B L_9DF5 stx <$2b | |
9DF7 7E83FF jmp basic_line_after_2b ; search program for line number in <$2b | |
9DFA BD8424 RENUM_dispatch jsr L_8424 ; clear variables & reset stack | |
9DFD CC000A ldd #$000a | |
9E00 DDD5 std <$d5 ; default RENUM 10,0,10 | |
9E02 DDCF std <$cf | |
9E04 5F clrb | |
9E05 DDD1 std <$d1 | |
9E07 9DA5 jsr <$a5 ; get current character from BASIC source | |
9E09 2406 bcc L_9E11 | |
9E0B 8DE0 bsr L_9DED ; read line number into X & $2b | |
9E0D 9FD5 stx <$d5 ; new start line | |
9E0F 9DA5 jsr <$a5 ; get current character from BASIC source | |
9E11 271B L_9E11 beq L_9E2E | |
9E13 BD89AA jsr CkComa ; skip comma | |
9E16 2406 bcc L_9E1E | |
9E18 8DD3 bsr L_9DED ; read line number into X & $2b | |
9E1A 9FD1 stx <$d1 ; line to start renumbering at | |
9E1C 9DA5 jsr <$a5 ; get current character from BASIC source | |
9E1E 270E L_9E1E beq L_9E2E | |
9E20 BD89AA jsr CkComa ; skip comma | |
9E23 2406 bcc L_9E2B | |
9E25 8DC6 bsr L_9DED ; read line number into X & $2b | |
9E27 9FCF stx <$cf ; line increment | |
9E29 2749 beq do_fc_error_9E74 ; ?FC ERROR | |
9E2B BDB7F9 L_9E2B jsr L_B7F9 ; cause error if next byte is not zero | |
9E2E 8DC3 L_9E2E bsr L_9DF3 ; search for start line | |
9E30 9FD3 stx <$d3 ; save address | |
9E32 9ED5 ldx <$d5 | |
9E34 8DBF bsr L_9DF5 ; search for new start line | |
9E36 9CD3 cmpx <$d3 ; not allowed to be lower than start line | |
9E38 253A bcs do_fc_error_9E74 ; ?FC ERROR | |
9E3A 8D1C bsr L_9E58 ; dry run - check lines don't get too high | |
9E3C BD9ECE jsr L_9ECE ; prepare line numbers in statements | |
9E3F BD83ED jsr BasVect2 ; set up next line pointers in BASIC program | |
9E42 8DAF bsr L_9DF3 ; search for start line | |
9E44 9FD3 stx <$d3 ; save address | |
9E46 8D3A bsr L_9E82 ; convert line numbers to addresses | |
9E48 8D0F bsr L_9E59 ; do the actual renumbering | |
9E4A 8D36 bsr L_9E82 ; convert addresses to line numbers | |
9E4C BD9F6C jsr L_9F6C ; convert line numbers back to ASCII | |
9E4F BD8424 jsr L_8424 ; clear variables & reset stack | |
9E52 BD83ED jsr BasVect2 ; set up next line pointers in BASIC program | |
9E55 7E8371 jmp goto_ok_prompt ; command mode | |
9E58 86 L_9E58 fcb $86 ; lda #$4f - comment byte / * RENUM: dry run to check that line numbers don't get too high | |
9E59 4F L_9E59 clra ; usually skipped by comment byte | |
9E5A 97D8 sta <$d8 ; * (9E59 4F CLRA) | |
9E5C 9ED3 ldx <$d3 ; start address | |
9E5E DCD5 ldd <$d5 ; new start number | |
9E60 8D15 bsr L_9E77 ; test for end of program | |
9E62 0DD8 L_9E62 tst <$d8 ; dry run flag | |
9E64 2602 bne L_9E68 | |
9E66 ED02 std 2,x ; store new line number | |
9E68 AE84 L_9E68 ldx ,x ; point X to next line | |
9E6A 8D0B bsr L_9E77 ; test for end of program | |
9E6C D3CF addd <$cf ; increment line number | |
9E6E 2504 bcs do_fc_error_9E74 ; ?FC ERROR | |
9E70 81FA cmpa #$fa | |
9E72 25EE bcs L_9E62 | |
9E74 7E8B8D do_fc_error_9E74 jmp FC_error ; ?FC ERROR | |
9E77 3406 L_9E77 pshs a,b ; * RENUM: test for end of program | |
9E79 EC84 ldd ,x | |
9E7B 3506 puls a,b | |
9E7D 2602 bne L_9E81 | |
9E7F 3262 leas 2,s ; return 2 levels if at end of program | |
9E81 39 L_9E81 rts | |
9E82 9E19 L_9E82 ldx <$19 ; start of BASIC program | |
9E84 301F leax -1,x | |
9E86 3001 L_9E86 leax 1,x | |
9E88 8DED bsr L_9E77 ; test for end of program | |
9E8A 3003 L_9E8A leax 3,x | |
9E8C 3001 L_9E8C leax 1,x | |
9E8E A684 lda ,x | |
9E90 27F4 beq L_9E86 ; end of line | |
9E92 9F0F stx <$0f | |
9E94 4A deca | |
9E95 270C beq L_9EA3 ; 1st pass - convert line number to address | |
9E97 4A deca | |
9E98 272A beq L_9EC4 ; 2nd pass - convert address to line number | |
9E9A 4A deca | |
9E9B 26EF bne L_9E8C | |
9E9D 8603 L_9E9D lda #$03 | |
9E9F A780 sta ,x+ | |
9EA1 20E7 bra L_9E8A | |
9EA3 EC01 L_9EA3 ldd 1,x ; reconstruct line number coded in block | |
9EA5 6A02 dec 2,x | |
9EA7 2701 beq L_9EAA | |
9EA9 4F clra | |
9EAA E603 L_9EAA ldb 3,x | |
9EAC 6A04 dec 4,x | |
9EAE 2701 beq L_9EB1 | |
9EB0 5F clrb | |
9EB1 ED01 L_9EB1 std 1,x | |
9EB3 DD2B std <$2b | |
9EB5 BD83FF jsr basic_line_after_2b ; search program for line number in <$2b | |
9EB8 9E0F L_9EB8 ldx <$0f | |
9EBA 25E1 bcs L_9E9D ; line not found - store a 3 for 'UL' | |
9EBC DC47 ldd <$47 ; address of line | |
9EBE 6C80 inc ,x+ | |
9EC0 ED84 std ,x | |
9EC2 20C6 bra L_9E8A | |
9EC4 6F84 L_9EC4 clr ,x ; becomes a 1 in a moment | |
9EC6 AE01 ldx 1,x ; address of line | |
9EC8 AE02 ldx 2,x ; actual line number | |
9ECA 9F47 stx <$47 | |
9ECC 20EA bra L_9EB8 ; store it in info block | |
9ECE 9E19 L_9ECE ldx <$19 ; start of BASIC program | |
9ED0 2004 bra L_9ED6 | |
9ED2 9EA6 L_9ED2 ldx <$a6 ; BASIC source pointer | |
9ED4 3001 leax 1,x | |
9ED6 8D9F L_9ED6 bsr L_9E77 ; test for end of program | |
9ED8 3002 leax 2,x | |
9EDA 3001 L_9EDA leax 1,x | |
9EDC 9FA6 L_9EDC stx <$a6 ; BASIC source pointer | |
9EDE 9D9F L_9EDE jsr <$9f ; get next character from BASIC source | |
9EE0 4D L_9EE0 tsta | |
9EE1 27EF beq L_9ED2 ; end of line | |
9EE3 2AF9 bpl L_9EDE ; non-token | |
9EE5 9EA6 ldx <$a6 ; BASIC source pointer | |
9EE7 81FF cmpa #$ff | |
9EE9 27EF beq L_9EDA ; skip function token | |
9EEB BD01A0 jsr >$01a0 ; PATCH - CLS GET PUT ??? | |
9EEE 81BF cmpa #$bf ; token THEN | |
9EF0 2712 beq L_9F04 | |
9EF2 8184 cmpa #$84 ; token ELSE | |
9EF4 270E beq L_9F04 | |
9EF6 8181 cmpa #$81 ; token GO | |
9EF8 26E4 bne L_9EDE | |
9EFA 9D9F jsr <$9f ; get next character from BASIC source | |
9EFC 81BC cmpa #$bc ; token TO | |
9EFE 2704 beq L_9F04 | |
9F00 81BD cmpa #$bd ; token SUB | |
9F02 26D8 bne L_9EDC ; keep looking for interesting stuff | |
9F04 9D9F L_9F04 jsr <$9f ; get next character from BASIC source | |
9F06 2504 bcs L_9F0C ; found digit | |
9F08 9DA5 L_9F08 jsr <$a5 ; get current character from BASIC source | |
9F0A 20D4 bra L_9EE0 | |
9F0C 9EA6 L_9F0C ldx <$a6 ; BASIC source pointer | |
9F0E 3410 pshs x ; start of digits | |
9F10 BD869A jsr L_869A ; read line number & store in $2b | |
9F13 9EA6 ldx <$a6 ; BASIC source pointer | |
9F15 A682 L_9F15 lda ,-x | |
9F17 BDA438 jsr L_A438 ; set carry if A is non-numeric character | |
9F1A 25F9 bcs L_9F15 | |
9F1C 3001 leax 1,x ; end of digits | |
9F1E 1F10 tfr x,d | |
9F20 E061 subb 1,s | |
9F22 C005 subb #$05 | |
9F24 2720 beq L_9F46 ; exactly 5 digits | |
9F26 250A bcs L_9F32 ; less than 5 digits | |
9F28 3384 leau ,x | |
9F2A 50 negb | |
9F2B 3085 leax b,x | |
9F2D BD9DA9 jsr L_9DA9 ; move program down from U to X | |
9F30 2014 bra L_9F46 | |
9F32 9F47 L_9F32 stx <$47 | |
9F34 9E1B ldx <$1b ; start of simple variables | |
9F36 9F43 stx <$43 | |
9F38 50 negb | |
9F39 3085 leax b,x | |
9F3B 9F41 stx <$41 | |
9F3D 9F1B stx <$1b ; start of simple variables | |
9F3F BD831C jsr L_831C ; move memory contents up | |
9F42 9E45 ldx <$45 | |
9F44 9FA6 stx <$a6 ; BASIC source pointer | |
9F46 3510 L_9F46 puls x ; start of digits | |
9F48 8601 lda #$01 | |
9F4A A784 sta ,x ; replace line number with 5 byte info block | |
9F4C A702 sta 2,x ; line number coded to avoid zeros | |
9F4E A704 sta 4,x ; otherwise world would fall apart | |
9F50 D62B ldb <$2b | |
9F52 2604 bne L_9F58 | |
9F54 C601 ldb #$01 | |
9F56 6C02 inc 2,x | |
9F58 E701 L_9F58 stb 1,x | |
9F5A D62C ldb <$2c | |
9F5C 2604 bne L_9F62 | |
9F5E C601 ldb #$01 | |
9F60 6C04 inc 4,x | |
9F62 E703 L_9F62 stb 3,x | |
9F64 9DA5 jsr <$a5 ; get current character from BASIC source | |
9F66 812C cmpa #$2c | |
9F68 279A beq L_9F04 ; comma - look for another line number | |
9F6A 209C bra L_9F08 | |
9F6C 9E19 L_9F6C ldx <$19 ; start of BASIC program | |
9F6E 301F leax -1,x | |
9F70 3001 L_9F70 leax 1,x | |
9F72 EC02 ldd 2,x | |
9F74 DD68 std <$68 ; current line number | |
9F76 BD9E77 jsr L_9E77 ; test for end of program | |
9F79 3003 leax 3,x | |
9F7B 3001 L_9F7B leax 1,x | |
9F7D A684 L_9F7D lda ,x | |
9F7F 27EF beq L_9F70 ; end of line | |
9F81 4A deca | |
9F82 271B beq L_9F9F ; found an info block | |
9F84 8002 suba #$02 | |
9F86 26F3 bne L_9F7B | |
9F88 3410 pshs x | |
9F8A 8E9FC9 ldx #text_ul - 1 ; /UL / | |
9F8D BD90E5 jsr out_string ; print string to DEVN | |
9F90 AEE4 ldx ,s | |
9F92 EC01 ldd 1,x | |
9F94 BD957A jsr print_D ; print unsigned number in D | |
9F97 BD9573 jsr L_9573 ; print 'IN xxxx' (current line number) | |
9F9A BD90A1 jsr print_CR ; send CR to DEVN | |
9F9D 3510 puls x | |
9F9F 3410 L_9F9F pshs x | |
9FA1 EC01 ldd 1,x ; adjusted line number | |
9FA3 DD52 std <$52 | |
9FA5 BD9C3E jsr Assign16BitB ; assign contents of $52 / $53 to FPA1 | |
9FA8 BD9587 jsr L_9587 ; convert FPA1 to string at $3DA | |
9FAB 3540 puls u | |
9FAD C605 ldb #$05 | |
9FAF 3001 L_9FAF leax 1,x ; write line number into program | |
9FB1 A684 lda ,x | |
9FB3 2705 beq L_9FBA | |
9FB5 5A decb | |
9FB6 A7C0 sta ,u+ | |
9FB8 20F5 bra L_9FAF | |
9FBA 30C4 L_9FBA leax ,u | |
9FBC 5D tstb | |
9FBD 27BE beq L_9F7D ; exactly 5 digits - no problem | |
9FBF 31C4 leay ,u | |
9FC1 33C5 leau b,u | |
9FC3 BD9DA9 jsr L_9DA9 ; move program down from U to X | |
9FC6 30A4 leax ,y | |
9FC8 20B3 bra L_9F7D | |
9FCA 554C2000 text_ul fcc /UL /,$00 ; /UL / | |
9FCE 931F mem_patch fcb $93,$1f ; end of BASIC storage | |
9FD0 0F06 varptr_patch clr <$06 ; numeric / string flag | |
9FD2 DD52 std <$52 | |
9FD4 C690 ldb #$90 ; meaningless | |
9FD6 7E9C3E jmp Assign16BitB ; assign contents of $52 / $53 to FPA1 | |
9FD9 00000000000000000000000000000000 fcb $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; * unused | |
9FE9 00000000000000000000000000000000 fcb $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 | |
9FF9 00000000000000 fcb $00,$00,$00,$00,$00,$00,$00 | |
A000 org $a000 ; scan keyboard | |
A000 8006B54A8021B93EB9998012801B indirect_jump_table fdb POLCAT,OUTCHR,call_CSRDON,BLKIN,BLKOUT,call_JOYIN,call_WRTLDR ; scan keyboard | |
A00E BD8E86 HEXstr_dispatch jsr L_8E86 ; read 16 bit number into X from FPA1 (& $52) | |
A011 8E03D9 ldx #$03d9 | |
A014 C604 ldb #$04 | |
A016 3404 L_A016 pshs b | |
A018 5F clrb | |
A019 8604 lda #$04 | |
A01B 0853 L_A01B lsl <$53 ; get a nibble into B | |
A01D 0952 rol <$52 | |
A01F 59 rolb | |
A020 4A deca | |
A021 26F8 bne L_A01B | |
A023 5D tstb | |
A024 260A bne L_A030 ; digit non-zero | |
A026 A6E4 lda ,s | |
A028 4A deca | |
A029 2705 beq L_A030 ; at last digit | |
A02B 8C03D9 cmpx #$03d9 | |
A02E 270C beq L_A03C ; don't store leading zeroes | |
A030 CB30 L_A030 addb #$30 | |
A032 C139 cmpb #$39 | |
A034 2302 bls L_A038 ; not A - F | |
A036 CB07 addb #$07 | |
A038 E780 L_A038 stb ,x+ | |
A03A 6F84 clr ,x | |
A03C 3504 L_A03C puls b | |
A03E 5A decb | |
A03F 26D5 bne L_A016 | |
A041 3262 leas 2,s ; lose return address | |
A043 8E03D8 ldx #$03d8 | |
A046 7E8C5B jmp L_8C5B ; register string at X | |
A049 BDB65F DLOAD_dispatch jsr L_B65F ; close cassette stream & set DEVN to 0 | |
A04C 6FE2 clr ,-s | |
A04E 9DA5 jsr <$a5 ; get current character from BASIC source | |
A050 814D cmpa #$4d | |
A052 2604 bne L_A058 | |
A054 A7E4 sta ,s | |
A056 9D9F jsr <$9f ; get next character from BASIC source | |
A058 BDB7AA L_A058 jsr L_B7AA ; get filename | |
A05B 9DA5 jsr <$a5 ; get current character from BASIC source | |
A05D 2711 beq L_A070 | |
A05F BD89AA jsr CkComa ; check comma | |
A062 812C cmpa #$2c | |
A064 270A beq L_A070 | |
A066 BD8E51 jsr Get8Bit ; get number in B | |
A069 BD8030 jsr call_SERSET ; select baud rate | |
A06C 1025EB1D lbcs FC_error ; ?FC ERROR | |
A070 BDA0F4 L_A070 jsr L_A0F4 ; send filename & get 1st block | |
A073 3402 pshs a | |
A075 86FD lda #$fd | |
A077 976F sta <$6f ; DEVN = -3 | |
A079 3502 puls a | |
A07B 6DE0 tst ,s+ | |
A07D 262A bne L_A0A9 ; DLOADM | |
A07F BDB7F9 jsr L_B7F9 ; ensure nothing else on command line | |
A082 5D tstb ; B must not be 0 | |
A083 2706 beq do_fm_error_A08B ; ?FM ERROR | |
A085 BD8417 jsr erase_basic ; NEW BASIC | |
A088 7E837A jmp L_837A ; command mode / no device initialise | |
A08B 7EB848 do_fm_error_A08B jmp FM_error ; ?FM ERROR | |
A08E 0F78 L_A08E clr <$78 ; cassette IO status | |
A090 9D9F jsr <$9f ; get next character from BASIC source | |
A092 BDB7AA jsr L_B7AA ; get filename | |
A095 BDB87A jsr L_B87A ; find file & set up buffer | |
A098 7D01E4 tst >$01e4 ; gap flag | |
A09B 1027169D lbeq L_B73C ; continuous file | |
A09F FE01E2 ldu >$01e2 ; U = file type & ASCII flag | |
A0A2 0A6F dec <$6f ; DEVN | |
A0A4 BDB867 jsr L_B867 ; get block from tape | |
A0A7 1F30 tfr u,d | |
A0A9 830200 L_A0A9 subd #$0200 ; * no data in the EOF block. | |
A0AC 26DD bne do_fm_error_A08B ; ?FM ERROR | |
A0AE 9E8A ldx <$8a ; zero | |
A0B0 9DA5 jsr <$a5 ; get current character from BASIC source | |
A0B2 2706 beq L_A0BA | |
A0B4 BD89AA jsr CkComa ; check comma | |
A0B7 BD8E83 jsr Get16Bit ; get 16 bit number into X | |
A0BA 9FD3 L_A0BA stx <$d3 ; load offset | |
A0BC BDB7F9 jsr L_B7F9 ; ensure nothing else on command line | |
A0BF 8D29 L_A0BF bsr wait_key_flash ; read character from DEVN | |
A0C1 3402 pshs a | |
A0C3 8D1E bsr L_A0E3 ; read 2 characters from DEVN into D | |
A0C5 1F02 tfr d,y ; Y = data length | |
A0C7 8D1A bsr L_A0E3 ; read 2 characters from DEVN into D | |
A0C9 D3D3 addd <$d3 | |
A0CB DD9D std <$9d ; default EXEC address | |
A0CD 1F01 tfr d,x ; X = load address (inc. offset) | |
A0CF A6E0 lda ,s+ | |
A0D1 1026158E lbne L_B663 ; close DEVN stream & set DEVN to 0 | |
A0D5 8D13 L_A0D5 bsr wait_key_flash ; read character from DEVN | |
A0D7 A784 sta ,x | |
A0D9 A180 cmpa ,x+ ; checks that we are loading into RAM | |
A0DB 2614 bne do_io_error_A0F1 ; ?IO ERROR | |
A0DD 313F leay -1,y | |
A0DF 26F4 bne L_A0D5 | |
A0E1 20DC bra L_A0BF | |
A0E3 8D00 L_A0E3 bsr L_A0E5 ; * read 2 characters from DEVN into D | |
A0E5 8D03 L_A0E5 bsr wait_key_flash ; read character from DEVN | |
A0E7 1E89 exg a,b | |
A0E9 39 L_A0E9 rts | |
A0EA BDB50A wait_key_flash jsr L_B50A ; * (+cause error if EOF) | |
A0ED 0D70 tst <$70 ; EOF flag | |
A0EF 27F8 beq L_A0E9 | |
A0F1 7EB84B do_io_error_A0F1 jmp IO_error ; ?IO ERROR | |
A0F4 8D1F L_A0F4 bsr L_A115 ; send filename to serial port | |
A0F6 3406 pshs a,b | |
A0F8 4C inca | |
A0F9 2706 beq NE_error | |
A0FB DE8A ldu <$8a ; zero | |
A0FD 8D09 bsr L_A108 ; get block from serial port | |
A0FF 3586 puls a,b,pc | |
A101 C634 NE_error ldb #$34 ; ?NE ERROR | |
A103 7E8344 jmp system_error | |
A106 DE7E L_A106 ldu <$7e ; * get block from serial port into IO buffer | |
A108 3041 L_A108 leax 1,u | |
A10A 9F7E stx <$7e | |
A10C 8E01DA ldx #$01da ; IO buffer | |
A10F BDA17E jsr L_A17E ; get serial block & store at X | |
A112 7EB876 jmp L_B876 ; update IO buffer size / reset header address | |
A115 4F L_A115 clra ; * send filename to serial port | |
A116 3416 pshs a,b,x | |
A118 31E4 leay ,s | |
A11A 2002 bra L_A11E | |
A11C 8D2B L_A11C bsr L_A149 ; 5 retries only | |
A11E 868A L_A11E lda #$8a | |
A120 8D37 bsr L_A159 ; clear checksum, write, read & compare | |
A122 26F8 bne L_A11C | |
A124 8E01D2 ldx #$01d2 ; filename | |
A127 A680 L_A127 lda ,x+ | |
A129 BDA1C1 jsr L_A1C1 ; update checksum & write serial | |
A12C 8C01DA cmpx #$01da ; IO buffer | |
A12F 26F6 bne L_A127 ; filename now sent | |
A131 8D30 bsr L_A163 ; send checksum & clear, read & compare #$c8 | |
A133 26E7 bne L_A11C | |
A135 8D3C bsr L_A173 ; read serial & update checksum | |
A137 26E3 bne L_A11C | |
A139 A722 sta 2,y | |
A13B 8D36 bsr L_A173 ; read serial & update checksum | |
A13D 26DD bne L_A11C | |
A13F A723 sta 3,y | |
A141 8D29 bsr L_A16C ; read serial, update checksum & load A | |
A143 26D7 bne L_A11C | |
A145 3262 leas 2,s | |
A147 3586 puls a,b,pc | |
A149 6CA4 L_A149 inc ,y ; * retry count - cause error if count reaches 5 | |
A14B A6A4 lda ,y | |
A14D 8105 cmpa #$05 | |
A14F 251A bcs L_A16B | |
A151 86BC lda #$bc | |
A153 BD802D jsr call_SEROUT ; write serial character | |
A156 7EB84B jmp IO_error ; ?IO ERROR | |
A159 3402 L_A159 pshs a ; * clear checksum, write serial, read & compare | |
A15B 8D5D bsr L_A1BA ; clear checksum, write serial & read | |
A15D 2602 bne L_A161 | |
A15F A1E4 cmpa ,s | |
A161 3582 L_A161 puls a,pc | |
A163 A621 L_A163 lda 1,y ; * send checksum & clear, read & compare #$c8 | |
A165 8D53 bsr L_A1BA ; clear checksum, write serial & read | |
A167 2602 bne L_A16B | |
A169 81C8 cmpa #$c8 | |
A16B 39 L_A16B rts | |
A16C 8D05 L_A16C bsr L_A173 ; read serial & update checksum | |
A16E 26FB bne L_A16B | |
A170 A621 lda 1,y | |
A172 39 rts | |
A173 BD802A L_A173 jsr call_SERIN ; read serial character | |
A176 3403 pshs cc,a | |
A178 A821 eora 1,y | |
A17A A721 sta 1,y | |
A17C 3583 puls cc,a,pc | |
A17E 4F L_A17E clra ; * get block from serial & store starting at X | |
A17F 3476 pshs a,b,x,y,u | |
A181 6867 lsl 7,s | |
A183 6966 rol 6,s | |
A185 6467 lsr 7,s | |
A187 31E4 leay ,s | |
A189 2002 bra L_A18D | |
A18B 8DBC L_A18B bsr L_A149 ; 5 retries only | |
A18D 8697 L_A18D lda #$97 | |
A18F 8DC8 bsr L_A159 ; clear checksum, write, read & compare | |
A191 26F8 bne L_A18B | |
A193 A626 lda 6,y | |
A195 8D2A bsr L_A1C1 ; update checksum & write serial | |
A197 A627 lda 7,y | |
A199 8D26 bsr L_A1C1 ; update checksum & write serial | |
A19B 8DC6 bsr L_A163 ; send checksum & clear, read & compare #$c8 | |
A19D 26EC bne L_A18B | |
A19F 8DD2 bsr L_A173 ; read serial & update checksum | |
A1A1 26E8 bne L_A18B | |
A1A3 A724 sta 4,y | |
A1A5 AE22 ldx 2,y | |
A1A7 C680 ldb #$80 | |
A1A9 8DC8 L_A1A9 bsr L_A173 ; read serial & update checksum | |
A1AB 26DE bne L_A18B | |
A1AD A780 sta ,x+ | |
A1AF 5A decb | |
A1B0 26F7 bne L_A1A9 | |
A1B2 8DB8 bsr L_A16C ; read serial, update checksum & load A | |
A1B4 26D5 bne L_A18B | |
A1B6 3264 leas 4,s | |
A1B8 3596 puls a,b,x,pc | |
A1BA 6F21 L_A1BA clr 1,y ; * clear checksum, write serial & read | |
A1BC 8D0B bsr L_A1C9 | |
A1BE 7E802A jmp call_SERIN ; read serial character | |
A1C1 3402 L_A1C1 pshs a ; * update checksum & write serial | |
A1C3 A821 eora 1,y | |
A1C5 A721 sta 1,y | |
A1C7 3502 puls a | |
A1C9 7E802D L_A1C9 jmp call_SEROUT ; write serial character | |
A1CC 8601 L_A1CC lda #$01 ; * handle ! (PRINT USING 1st character) | |
A1CE 97D9 sta <$d9 | |
A1D0 5A L_A1D0 decb | |
A1D1 BDA366 jsr L_A366 ; print a plus sign to DEVN if $DA set | |
A1D4 9DA5 jsr <$a5 ; get current character from BASIC source | |
A1D6 1027008C lbeq L_A266 | |
A1DA D7D3 stb <$d3 | |
A1DC BD8887 jsr get_string ; get expression | |
A1DF BD8877 jsr get_expr ; validate string | |
A1E2 9E52 ldx <$52 | |
A1E4 9F4D stx <$4d | |
A1E6 D6D9 ldb <$d9 | |
A1E8 BD8DF3 jsr L_8DF3 ; perform left$ of B chrs on varptr X | |
A1EB BD90E8 jsr L_90E8 ; print string just compiled to DEVN | |
A1EE 9E52 ldx <$52 | |
A1F0 D6D9 ldb <$d9 | |
A1F2 E084 subb ,x | |
A1F4 5A L_A1F4 decb | |
A1F5 102B0148 lbmi L_A341 | |
A1F9 BD90F5 jsr L_90F5 ; send a space to DEVN | |
A1FC 20F6 bra L_A1F4 | |
A1FE D7D3 L_A1FE stb <$d3 ; * handle % (PRINT USING string field) | |
A200 9F0F stx <$0f | |
A202 8602 lda #$02 | |
A204 97D9 sta <$d9 | |
A206 A684 L_A206 lda ,x | |
A208 8125 cmpa #$25 | |
A20A 27C4 beq L_A1D0 | |
A20C 8120 cmpa #$20 | |
A20E 2607 bne L_A217 | |
A210 0CD9 inc <$d9 | |
A212 3001 leax 1,x | |
A214 5A decb | |
A215 26EF bne L_A206 | |
A217 9E0F L_A217 ldx <$0f | |
A219 D6D3 ldb <$d3 | |
A21B 8625 lda #$25 | |
A21D BDA366 L_A21D jsr L_A366 ; print a plus sign to DEVN if $DA set | |
A220 BDB54A jsr OUTCHR ; output character to DEVN | |
A223 2022 bra L_A247 | |
A225 BD8889 L_A225 jsr L_8889 ; get expression | |
A228 BD8877 jsr get_expr ; validate string | |
A22B C63B ldb #$3b | |
A22D BD89AC jsr CkChar ; skip semicolon | |
A230 9E52 ldx <$52 | |
A232 9FD5 stx <$d5 ; varptr of USING string | |
A234 2006 bra L_A23C | |
A236 96D7 L_A236 lda <$d7 | |
A238 2708 beq do_fc_error_A242 ; ?FC ERROR | |
A23A 9ED5 ldx <$d5 | |
A23C 0FD7 L_A23C clr <$d7 ; comma counter? | |
A23E E684 ldb ,x | |
A240 2603 bne L_A245 ; USING string has a length | |
A242 7E8B8D do_fc_error_A242 jmp FC_error ; ?FC ERROR | |
A245 AE02 L_A245 ldx 2,x ; point X to USING string | |
A247 0FDA L_A247 clr <$da | |
A249 0FD9 L_A249 clr <$d9 | |
A24B A680 lda ,x+ | |
A24D 8121 cmpa #$21 | |
A24F 1027FF79 lbeq L_A1CC ; print 1st character | |
A253 8123 cmpa #$23 | |
A255 275B beq L_A2B2 ; numeric field | |
A257 5A decb | |
A258 2616 bne L_A270 | |
A25A BDA366 jsr L_A366 ; print a plus sign to DEVN if $DA set | |
A25D BDB54A jsr OUTCHR ; output character to DEVN | |
A260 9DA5 L_A260 jsr <$a5 ; get current character from BASIC source | |
A262 26D2 bne L_A236 | |
A264 96D7 lda <$d7 | |
A266 2603 L_A266 bne L_A26B | |
A268 BD90A1 jsr print_CR ; send CR to DEVN | |
A26B 9ED5 L_A26B ldx <$d5 | |
A26D 7E8D9F jmp DELVAR ; point X to string & length in B | |
A270 812B L_A270 cmpa #$2b | |
A272 2609 bne L_A27D | |
A274 BDA366 jsr L_A366 ; print a plus sign to DEVN if $DA set | |
A277 8608 lda #$08 | |
A279 97DA sta <$da | |
A27B 20CC bra L_A249 | |
A27D 812E L_A27D cmpa #$2e | |
A27F 274E beq L_A2CF | |
A281 8125 cmpa #$25 | |
A283 1027FF77 lbeq L_A1FE | |
A287 A184 cmpa ,x | |
A289 2692 L_A289 bne L_A21D | |
A28B 8124 cmpa #$24 | |
A28D 2719 beq L_A2A8 | |
A28F 812A cmpa #$2a | |
A291 26F6 bne L_A289 | |
A293 96DA lda <$da | |
A295 8A20 ora #$20 | |
A297 97DA sta <$da | |
A299 C102 cmpb #$02 | |
A29B 2511 bcs L_A2AE | |
A29D A601 lda 1,x | |
A29F 8124 cmpa #$24 | |
A2A1 260B bne L_A2AE | |
A2A3 5A decb | |
A2A4 3001 leax 1,x | |
A2A6 0CD9 inc <$d9 | |
A2A8 96DA L_A2A8 lda <$da | |
A2AA 8A10 ora #$10 | |
A2AC 97DA sta <$da | |
A2AE 3001 L_A2AE leax 1,x | |
A2B0 0CD9 inc <$d9 | |
A2B2 0FD8 L_A2B2 clr <$d8 | |
A2B4 0CD9 L_A2B4 inc <$d9 | |
A2B6 5A decb | |
A2B7 2749 beq L_A302 | |
A2B9 A680 lda ,x+ | |
A2BB 812E cmpa #$2e | |
A2BD 271E beq L_A2DD | |
A2BF 8123 cmpa #$23 | |
A2C1 27F1 beq L_A2B4 | |
A2C3 812C cmpa #$2c | |
A2C5 2621 bne L_A2E8 | |
A2C7 96DA lda <$da | |
A2C9 8A40 ora #$40 | |
A2CB 97DA sta <$da | |
A2CD 20E5 bra L_A2B4 | |
A2CF A684 L_A2CF lda ,x | |
A2D1 8123 cmpa #$23 | |
A2D3 1026FF46 lbne L_A21D | |
A2D7 8601 lda #$01 | |
A2D9 97D8 sta <$d8 | |
A2DB 3001 leax 1,x | |
A2DD 0CD8 L_A2DD inc <$d8 | |
A2DF 5A decb | |
A2E0 2720 beq L_A302 | |
A2E2 A680 lda ,x+ | |
A2E4 8123 cmpa #$23 | |
A2E6 27F5 beq L_A2DD | |
A2E8 815E L_A2E8 cmpa #$5e | |
A2EA 2616 bne L_A302 | |
A2EC A184 cmpa ,x | |
A2EE 2612 bne L_A302 | |
A2F0 A101 cmpa 1,x | |
A2F2 260E bne L_A302 | |
A2F4 A102 cmpa 2,x | |
A2F6 260A bne L_A302 | |
A2F8 C104 cmpb #$04 | |
A2FA 2506 bcs L_A302 | |
A2FC C004 subb #$04 | |
A2FE 3004 leax 4,x | |
A300 0CDA inc <$da | |
A302 301F L_A302 leax -1,x | |
A304 0CD9 inc <$d9 | |
A306 96DA lda <$da | |
A308 8508 bita #$08 | |
A30A 2618 bne L_A324 | |
A30C 0AD9 dec <$d9 | |
A30E 5D tstb | |
A30F 2713 beq L_A324 | |
A311 A684 lda ,x | |
A313 802D suba #$2d | |
A315 2706 beq L_A31D | |
A317 81FE cmpa #$fe | |
A319 2609 bne L_A324 | |
A31B 8608 lda #$08 | |
A31D 8A04 L_A31D ora #$04 | |
A31F 9ADA ora <$da | |
A321 97DA sta <$da | |
A323 5A decb | |
A324 9DA5 L_A324 jsr <$a5 ; get current character from BASIC source | |
A326 1027FF3C lbeq L_A266 | |
A32A D7D3 stb <$d3 | |
A32C BD8872 jsr L_8872 | |
A32F 96D9 lda <$d9 | |
A331 9BD8 adda <$d8 | |
A333 8111 cmpa #$11 | |
A335 1022E854 lbhi FC_error ; ?FC ERROR | |
A339 BDA373 jsr L_A373 | |
A33C 301F leax -1,x | |
A33E BD90E5 jsr out_string ; print string to DEVN | |
A341 0FD7 L_A341 clr <$d7 | |
A343 9DA5 jsr <$a5 ; get current character from BASIC source | |
A345 270D beq L_A354 | |
A347 97D7 sta <$d7 | |
A349 813B cmpa #$3b | |
A34B 2705 beq L_A352 | |
A34D BD89AA jsr CkComa ; check comma | |
A350 2002 bra L_A354 | |
A352 9D9F L_A352 jsr <$9f ; get next character from BASIC source | |
A354 9ED5 L_A354 ldx <$d5 | |
A356 E684 ldb ,x | |
A358 D0D3 subb <$d3 | |
A35A AE02 ldx 2,x | |
A35C 3A abx | |
A35D D6D3 ldb <$d3 | |
A35F 1026FEE4 lbne L_A247 | |
A363 7EA260 jmp L_A260 | |
A366 3402 L_A366 pshs a ; * print a plus sign to DEVN if $DA set | |
A368 862B lda #$2b | |
A36A 0DDA tst <$da | |
A36C 2703 beq L_A371 | |
A36E BDB54A jsr OUTCHR ; output character to DEVN | |
A371 3582 L_A371 puls a,pc | |
A373 CE03DB L_A373 ldu #$03db | |
A376 C620 ldb #$20 | |
A378 96DA lda <$da | |
A37A 8508 bita #$08 | |
A37C 2702 beq L_A380 | |
A37E C62B ldb #$2b | |
A380 0D54 L_A380 tst <$54 | |
A382 2A04 bpl L_A388 | |
A384 0F54 clr <$54 | |
A386 C62D ldb #$2d | |
A388 E7C0 L_A388 stb ,u+ | |
A38A C630 ldb #$30 | |
A38C E7C0 stb ,u+ | |
A38E 8401 anda #$01 | |
A390 10260107 lbne L_A49B | |
A394 8E956E ldx #data_956E ; FP constant 1000000000 | |
A397 BD944B jsr L_944B ; compare FPA1 - varptr X (of same sign) | |
A39A 2B15 bmi L_A3B1 | |
A39C BD9587 jsr L_9587 ; convert FPA1 to string at $3da | |
A39F A680 L_A39F lda ,x+ | |
A3A1 26FC bne L_A39F | |
A3A3 A682 L_A3A3 lda ,-x | |
A3A5 A701 sta 1,x | |
A3A7 8C03DA cmpx #$03da | |
A3AA 26F7 bne L_A3A3 | |
A3AC 8625 lda #$25 | |
A3AE A784 sta ,x | |
A3B0 39 rts | |
A3B1 964F L_A3B1 lda <$4f | |
A3B3 9747 sta <$47 | |
A3B5 2703 beq L_A3BA | |
A3B7 BDA55B jsr L_A55B ; convert FPA1 to sig figs & exponent in $47 | |
A3BA 9647 L_A3BA lda <$47 | |
A3BC 102B0081 lbmi L_A441 | |
A3C0 40 nega | |
A3C1 9BD9 adda <$d9 | |
A3C3 8009 suba #$09 | |
A3C5 BDA478 jsr L_A478 | |
A3C8 BDA5F1 jsr L_A5F1 | |
A3CB BDA590 jsr L_A590 ; print number to U (commas & point if reqd) | |
A3CE 9647 lda <$47 | |
A3D0 BDA60F jsr L_A60F | |
A3D3 9647 lda <$47 | |
A3D5 BDA5D7 jsr L_A5D7 | |
A3D8 96D8 lda <$d8 | |
A3DA 2602 bne L_A3DE | |
A3DC 335F leau -1,u | |
A3DE 4A L_A3DE deca | |
A3DF BDA478 jsr L_A478 | |
A3E2 BDA513 L_A3E2 jsr L_A513 | |
A3E5 4D tsta | |
A3E6 2706 beq L_A3EE | |
A3E8 C12A cmpb #$2a | |
A3EA 2702 beq L_A3EE | |
A3EC E7C0 stb ,u+ | |
A3EE 6FC4 L_A3EE clr ,u | |
A3F0 8E03DA ldx #$03da | |
A3F3 3001 L_A3F3 leax 1,x | |
A3F5 9F0F stx <$0f | |
A3F7 963A lda <$3a | |
A3F9 9010 suba <$10 | |
A3FB 90D9 suba <$d9 | |
A3FD 2738 beq L_A437 | |
A3FF A684 lda ,x | |
A401 8120 cmpa #$20 | |
A403 27EE beq L_A3F3 | |
A405 812A cmpa #$2a | |
A407 27EA beq L_A3F3 | |
A409 4F clra | |
A40A 3402 L_A40A pshs a | |
A40C A680 lda ,x+ | |
A40E 812D cmpa #$2d | |
A410 27F8 beq L_A40A | |
A412 812B cmpa #$2b | |
A414 27F4 beq L_A40A | |
A416 8124 cmpa #$24 | |
A418 27F0 beq L_A40A | |
A41A 8130 cmpa #$30 | |
A41C 260E bne L_A42C | |
A41E A601 lda 1,x | |
A420 8D16 bsr L_A438 ; carry set if A non-numeric | |
A422 2508 bcs L_A42C | |
A424 3502 L_A424 puls a | |
A426 A782 sta ,-x | |
A428 26FA bne L_A424 | |
A42A 20C7 bra L_A3F3 | |
A42C 3502 L_A42C puls a | |
A42E 4D tsta | |
A42F 26FB bne L_A42C | |
A431 9E0F ldx <$0f | |
A433 8625 lda #$25 | |
A435 A782 sta ,-x | |
A437 39 L_A437 rts | |
A438 8130 L_A438 cmpa #$30 ; * carry clear if A is ASCII digit | |
A43A 2504 bcs L_A440 | |
A43C 803A suba #$3a | |
A43E 80C6 suba #$c6 | |
A440 39 L_A440 rts | |
A441 96D8 L_A441 lda <$d8 | |
A443 2701 beq L_A446 | |
A445 4A deca | |
A446 9B47 L_A446 adda <$47 | |
A448 2B01 bmi L_A44B | |
A44A 4F clra | |
A44B 3402 L_A44B pshs a | |
A44D 2A0A L_A44D bpl L_A459 | |
A44F 3402 pshs a | |
A451 BD932D jsr L_932D ; divide FPA1 by 10 | |
A454 3502 puls a | |
A456 4C inca | |
A457 20F4 bra L_A44D | |
A459 9647 L_A459 lda <$47 | |
A45B A0E0 suba ,s+ | |
A45D 9747 sta <$47 | |
A45F 8B09 adda #$09 | |
A461 2B19 bmi L_A47C | |
A463 96D9 lda <$d9 | |
A465 8009 suba #$09 | |
A467 9047 suba <$47 | |
A469 8D0D bsr L_A478 | |
A46B BDA5F1 jsr L_A5F1 | |
A46E 201D bra L_A48D | |
A470 3402 L_A470 pshs a | |
A472 8630 lda #$30 | |
A474 A7C0 sta ,u+ | |
A476 3502 puls a | |
A478 4A L_A478 deca | |
A479 2AF5 bpl L_A470 | |
A47B 39 rts | |
A47C 96D9 L_A47C lda <$d9 | |
A47E 8DF8 bsr L_A478 | |
A480 BDA5DB jsr L_A5DB | |
A483 86F7 lda #$f7 | |
A485 9047 suba <$47 | |
A487 8DEF bsr L_A478 | |
A489 0F45 clr <$45 | |
A48B 0FD7 clr <$d7 | |
A48D BDA590 L_A48D jsr L_A590 ; print number to U (commas & point if reqd) | |
A490 96D8 lda <$d8 | |
A492 2602 bne L_A496 | |
A494 DE39 ldu <$39 | |
A496 9B47 L_A496 adda <$47 | |
A498 16FF43 lbra L_A3DE | |
A49B 964F L_A49B lda <$4f | |
A49D 3402 pshs a | |
A49F 2703 beq L_A4A4 | |
A4A1 BDA55B jsr L_A55B ; convert FPA1 to sig figs & exponent in $47 | |
A4A4 96D8 L_A4A4 lda <$d8 | |
A4A6 2701 beq L_A4A9 | |
A4A8 4A deca | |
A4A9 9BD9 L_A4A9 adda <$d9 | |
A4AB 7F03DA clr >$03da | |
A4AE D6DA ldb <$da | |
A4B0 C404 andb #$04 | |
A4B2 2603 bne L_A4B7 | |
A4B4 7303DA com >$03da | |
A4B7 BB03DA L_A4B7 adda >$03da | |
A4BA 8009 suba #$09 | |
A4BC 3402 pshs a | |
A4BE 2A0A L_A4BE bpl L_A4CA | |
A4C0 3402 pshs a | |
A4C2 BD932D jsr L_932D ; divide FPA1 by 10 | |
A4C5 3502 puls a | |
A4C7 4C inca | |
A4C8 20F4 bra L_A4BE | |
A4CA A6E4 L_A4CA lda ,s | |
A4CC 2B01 bmi L_A4CF | |
A4CE 4F clra | |
A4CF 40 L_A4CF nega | |
A4D0 9BD9 adda <$d9 | |
A4D2 4C inca | |
A4D3 BB03DA adda >$03da | |
A4D6 9745 sta <$45 | |
A4D8 0FD7 clr <$d7 | |
A4DA BDA590 jsr L_A590 ; print number to U (commas & point if reqd) | |
A4DD 3502 puls a | |
A4DF BDA60F jsr L_A60F | |
A4E2 96D8 lda <$d8 | |
A4E4 2602 bne L_A4E8 | |
A4E6 335F leau -1,u | |
A4E8 E6E0 L_A4E8 ldb ,s+ | |
A4EA 2709 beq L_A4F5 | |
A4EC D647 ldb <$47 | |
A4EE CB09 addb #$09 | |
A4F0 D0D9 subb <$d9 | |
A4F2 F003DA subb >$03da | |
A4F5 862B L_A4F5 lda #$2b | |
A4F7 5D tstb | |
A4F8 2A03 bpl L_A4FD | |
A4FA 862D lda #$2d | |
A4FC 50 negb | |
A4FD A741 L_A4FD sta 1,u | |
A4FF 8645 lda #$45 | |
A501 A7C1 sta ,u++ | |
A503 862F lda #$2f | |
A505 4C L_A505 inca | |
A506 C00A subb #$0a | |
A508 24FB bcc L_A505 | |
A50A CB3A addb #$3a | |
A50C EDC1 std ,u++ | |
A50E 6FC4 clr ,u | |
A510 7EA3E2 jmp L_A3E2 | |
A513 8E03DB L_A513 ldx #$03db | |
A516 E684 ldb ,x | |
A518 3404 pshs b | |
A51A 8620 lda #$20 | |
A51C D6DA ldb <$da | |
A51E C520 bitb #$20 | |
A520 3504 puls b | |
A522 2708 beq L_A52C | |
A524 862A lda #$2a | |
A526 C120 cmpb #$20 | |
A528 2602 bne L_A52C | |
A52A 1F89 tfr a,b | |
A52C 3404 L_A52C pshs b | |
A52E A780 L_A52E sta ,x+ | |
A530 E684 ldb ,x | |
A532 2710 beq L_A544 | |
A534 C145 cmpb #$45 | |
A536 270C beq L_A544 | |
A538 C130 cmpb #$30 | |
A53A 27F2 beq L_A52E | |
A53C C12C cmpb #$2c | |
A53E 27EE beq L_A52E | |
A540 C12E cmpb #$2e | |
A542 2604 bne L_A548 | |
A544 8630 L_A544 lda #$30 | |
A546 A782 sta ,-x | |
A548 96DA L_A548 lda <$da | |
A54A 8510 bita #$10 | |
A54C 2704 beq L_A552 | |
A54E C624 ldb #$24 | |
A550 E782 stb ,-x | |
A552 8404 L_A552 anda #$04 | |
A554 3504 puls b | |
A556 2602 bne L_A55A | |
A558 E782 stb ,-x | |
A55A 39 L_A55A rts | |
A55B 3440 L_A55B pshs u ; * convert FPA1 to sig figs & exponent in $47 | |
A55D 4F clra | |
A55E 9747 L_A55E sta <$47 | |
A560 D64F ldb <$4f | |
A562 C180 cmpb #$80 | |
A564 2211 bhi L_A577 | |
A566 8E956E ldx #data_956E ; FP constant 1000000000 | |
A569 BD9273 jsr L_9273 ; FPA1 = varptr X * FPA1 | |
A56C 9647 lda <$47 | |
A56E 8009 suba #$09 | |
A570 20EC bra L_A55E | |
A572 BD932D L_A572 jsr L_932D ; divide FPA1 by 10 | |
A575 0C47 inc <$47 | |
A577 8E9569 L_A577 ldx #data_9569 ; FP constant 999999999 | |
A57A BD944B jsr L_944B ; compare FPA1 - varptr X (of same sign) | |
A57D 2EF3 bgt L_A572 | |
A57F 8E9564 L_A57F ldx #data_9564 ; FP constant 99999999.9 | |
A582 BD944B jsr L_944B ; compare FPA1 - varptr X (of same sign) | |
A585 2E07 bgt L_A58E | |
A587 BD9315 jsr L_9315 ; multiply FPA1 by 10 | |
A58A 0A47 dec <$47 | |
A58C 20F1 bra L_A57F | |
A58E 35C0 L_A58E puls u,pc | |
A590 3440 L_A590 pshs u ; * print number to U (commas & point if reqd) | |
A592 BD90FD jsr L_90FD ; add 0.5 to FPA1 | |
A595 BD9473 jsr L_9473 ; denormalize FPA1 to an integer | |
A598 3540 puls u | |
A59A 8E9673 ldx #data_9673 ; powers of 10 table | |
A59D C680 ldb #$80 | |
A59F 8D36 L_A59F bsr L_A5D7 | |
A5A1 9653 L_A5A1 lda <$53 | |
A5A3 AB03 adda 3,x | |
A5A5 9753 sta <$53 | |
A5A7 9652 lda <$52 | |
A5A9 A902 adca 2,x | |
A5AB 9752 sta <$52 | |
A5AD 9651 lda <$51 | |
A5AF A901 adca 1,x | |
A5B1 9751 sta <$51 | |
A5B3 9650 lda <$50 | |
A5B5 A984 adca ,x | |
A5B7 9750 sta <$50 | |
A5B9 5C incb | |
A5BA 56 rorb | |
A5BB 59 rolb | |
A5BC 28E3 bvc L_A5A1 | |
A5BE 2403 bcc L_A5C3 | |
A5C0 C00B subb #$0b | |
A5C2 50 negb | |
A5C3 CB2F L_A5C3 addb #$2f | |
A5C5 3004 leax 4,x | |
A5C7 1F98 tfr b,a | |
A5C9 847F anda #$7f | |
A5CB A7C0 sta ,u+ | |
A5CD 53 comb | |
A5CE C480 andb #$80 | |
A5D0 8C9697 cmpx #SQR_dispatch | |
A5D3 26CA bne L_A59F | |
A5D5 6FC4 clr ,u | |
A5D7 0A45 L_A5D7 dec <$45 | |
A5D9 2609 bne L_A5E4 | |
A5DB DF39 L_A5DB stu <$39 | |
A5DD 862E lda #$2e | |
A5DF A7C0 sta ,u+ | |
A5E1 0FD7 clr <$d7 | |
A5E3 39 rts | |
A5E4 0AD7 L_A5E4 dec <$d7 ; * store a comma if required | |
A5E6 2608 bne L_A5F0 | |
A5E8 8603 lda #$03 | |
A5EA 97D7 sta <$d7 | |
A5EC 862C lda #$2c | |
A5EE A7C0 sta ,u+ | |
A5F0 39 L_A5F0 rts | |
A5F1 9647 L_A5F1 lda <$47 | |
A5F3 8B0A adda #$0a | |
A5F5 9745 sta <$45 | |
A5F7 4C inca | |
A5F8 8003 L_A5F8 suba #$03 | |
A5FA 24FC bcc L_A5F8 | |
A5FC 8B05 adda #$05 | |
A5FE 97D7 sta <$d7 | |
A600 96DA lda <$da | |
A602 8440 anda #$40 | |
A604 2602 bne L_A608 | |
A606 97D7 sta <$d7 | |
A608 39 L_A608 rts | |
A609 3402 L_A609 pshs a | |
A60B 8DCA bsr L_A5D7 | |
A60D 3502 puls a | |
A60F 4A L_A60F deca | |
A610 2B0A bmi L_A61C | |
A612 3402 pshs a | |
A614 8630 lda #$30 | |
A616 A7C0 sta ,u+ | |
A618 A6E0 lda ,s+ | |
A61A 26ED bne L_A609 | |
A61C 39 L_A61C rts | |
A61D CEA62A L_A61D ldu #data_A62A ; * get address of pixel calc routine for current PMODE | |
A620 96B6 lda <$b6 ; current PMODE | |
A622 48 lsla | |
A623 EEC6 ldu a,u | |
A625 39 rts | |
A626 8DF5 L_A626 bsr L_A61D ; * call relevant pixel calc routine for PMODE | |
A628 6EC4 jmp ,u | |
A62A A634A650A634A650A634 data_A62A fdb jmp_A634,jmp_A650,jmp_A634,jmp_A650,jmp_A634 ; * JMP table containing pixel calc routines for each PMODE | |
A634 3444 jmp_A634 pshs b,u ; * calculate pixel address & mask for 2 colour modes | |
A636 D6B9 ldb <$b9 ; bytes per line in current graphics mode | |
A638 96C0 lda <$c0 | |
A63A 3D mul | |
A63B D3BA addd <$ba ; start of current graphics | |
A63D 1F01 tfr d,x | |
A63F D6BE ldb <$be | |
A641 54 lsrb | |
A642 54 lsrb | |
A643 54 lsrb | |
A644 3A abx | |
A645 96BE lda <$be | |
A647 8407 anda #$07 | |
A649 CEA66B ldu #data_A66B | |
A64C A6C6 lda a,u | |
A64E 35C4 puls b,u,pc | |
A650 3444 jmp_A650 pshs b,u ; * calculate pixel address & mask for 4 colour modes | |
A652 D6B9 ldb <$b9 ; bytes per line in current graphics mode | |
A654 96C0 lda <$c0 | |
A656 3D mul | |
A657 D3BA addd <$ba ; start of current graphics | |
A659 1F01 tfr d,x | |
A65B D6BE ldb <$be | |
A65D 54 lsrb | |
A65E 54 lsrb | |
A65F 3A abx | |
A660 96BE lda <$be | |
A662 8403 anda #$03 | |
A664 CEA673 ldu #data_A673 | |
A667 A6C6 lda a,u | |
A669 35C4 puls b,u,pc | |
A66B 8040201008040201 data_A66B fcb $80,$40,$20,$10,$08,$04,$02,$01 ; * pixel mask table for 2 colour modes | |
A673 C0300C03 data_A673 fcb $c0,$30,$0c,$03 ; * pixel mask table for 4 colour modes | |
A677 D6B9 jmp_A677 ldb <$b9 ; bytes per line in current graphics mode | |
A679 3A abx | |
A67A 39 rts | |
A67B 44 jmp_A67B lsra ; * used by LINE | |
A67C 2403 bcc L_A681 | |
A67E 46 rora | |
A67F 3001 leax 1,x | |
A681 39 L_A681 rts | |
A682 44 jmp_A682 lsra ; * used by LINE | |
A683 24F6 bcc jmp_A67B | |
A685 86C0 lda #$c0 | |
A687 3001 leax 1,x | |
A689 39 rts | |
A68A BD8E7A L_A68A jsr L_8E7A ; read pair of numbers into $2b/$2c & B | |
A68D 108E00BD ldy #$00bd | |
A691 C1C0 L_A691 cmpb #$c0 | |
A693 2502 bcs L_A697 | |
A695 C6BF ldb #$bf | |
A697 4F L_A697 clra | |
A698 ED22 std 2,y | |
A69A DC2B ldd <$2b | |
A69C 10830100 cmpd #$0100 | |
A6A0 2503 bcs L_A6A5 | |
A6A2 CC00FF ldd #$00ff | |
A6A5 EDA4 L_A6A5 std ,y | |
A6A7 39 rts | |
A6A8 BDA68A L_A6A8 jsr L_A68A ; read coordinates into $bd & $bf | |
A6AB CE00BD L_A6AB ldu #$00bd ; * adjust standard coords into true pixel coords | |
A6AE 96B6 L_A6AE lda <$b6 ; current PMODE | |
A6B0 8102 cmpa #$02 | |
A6B2 2406 bcc L_A6BA | |
A6B4 EC42 ldd 2,u ; adjust Y for PMODEs 0 & 1 | |
A6B6 44 lsra | |
A6B7 56 rorb | |
A6B8 ED42 std 2,u | |
A6BA 96B6 L_A6BA lda <$b6 ; current PMODE | |
A6BC 8104 cmpa #$04 | |
A6BE 2406 bcc L_A6C6 | |
A6C0 ECC4 ldd ,u ; adjust X for PMODEs 0 to 3 | |
A6C2 44 lsra | |
A6C3 56 rorb | |
A6C4 EDC4 std ,u | |
A6C6 39 L_A6C6 rts | |
A6C7 BDA740 PPOINT_dispatch jsr L_A740 ; get coords into $bd / $bf | |
A6CA BDA6AB jsr L_A6AB ; adjust coords for PMODE | |
A6CD BDA626 jsr L_A626 ; call relevant pixel calc routine for PMODE | |
A6D0 A484 anda ,x | |
A6D2 D6B6 ldb <$b6 ; current PMODE | |
A6D4 56 rorb | |
A6D5 2412 bcc L_A6E9 | |
A6D7 8104 L_A6D7 cmpa #$04 | |
A6D9 2504 bcs L_A6DF | |
A6DB 46 rora | |
A6DC 46 rora | |
A6DD 20F8 bra L_A6D7 | |
A6DF 4C L_A6DF inca | |
A6E0 48 lsla | |
A6E1 9BC1 adda <$c1 ; current colour set | |
A6E3 44 lsra | |
A6E4 1F89 L_A6E4 tfr a,b | |
A6E6 7E8C36 jmp Assign8Bit ; assign B to FPA1 | |
A6E9 4D L_A6E9 tsta | |
A6EA 27F8 beq L_A6E4 | |
A6EC 4F clra | |
A6ED 20F0 bra L_A6DF | |
A6EF 8601 PSET_dispatch lda #$01 ; * PSET | |
A6F1 2001 bra L_A6F4 | |
A6F3 4F PRESET_dispatch clra ; * PRESET | |
A6F4 97C2 L_A6F4 sta <$c2 ; PRESET / PSET flag | |
A6F6 BD89A7 jsr CkOpBrak ; skip open bracket | |
A6F9 BDA6A8 jsr L_A6A8 ; read coords into $bd & $bf and adjust | |
A6FC BDA90F jsr L_A90F ; read optional colour | |
A6FF BD89A4 jsr CkClBrak ; skip close bracket | |
A702 BDA626 jsr L_A626 ; call relevant pixel calc routine for PMODE | |
A705 E684 L_A705 ldb ,x ; * called by LINE to plot pixel | |
A707 3404 pshs b | |
A709 1F89 tfr a,b | |
A70B 43 coma | |
A70C A484 anda ,x | |
A70E D4B5 andb <$b5 ; byte value of plot colour | |
A710 3404 pshs b | |
A712 AAE0 ora ,s+ | |
A714 A784 sta ,x | |
A716 A0E0 suba ,s+ | |
A718 9ADB ora <$db | |
A71A 97DB sta <$db | |
A71C 39 rts | |
A71D 9EC7 L_A71D ldx <$c7 ; * if first pair is missing then current coords are used | |
A71F 9FBD stx <$bd | |
A721 9EC9 ldx <$c9 | |
A723 9FBF stx <$bf | |
A725 81C4 cmpa #$c4 ; token - | |
A727 2703 beq L_A72C | |
A729 BDA740 jsr L_A740 | |
A72C C6C4 L_A72C ldb #$c4 | |
A72E BD89AC jsr CkChar | |
A731 BD89A7 jsr CkOpBrak ; skip open bracket | |
A734 BD8E7A jsr L_8E7A ; read pair of numbers into $2b/$2c & B | |
A737 108E00C3 ldy #$00c3 | |
A73B BDA691 jsr L_A691 | |
A73E 2006 bra L_A746 ; skip close bracket | |
A740 BD89A7 L_A740 jsr CkOpBrak ; skip open bracket | |
A743 BDA68A jsr L_A68A ; read coordinates into $bd & $bf | |
A746 7E89A4 L_A746 jmp CkClBrak ; skip close bracket | |
A749 8189 LINE_dispatch cmpa #$89 ; token INPUT | |
A74B 1027F662 lbeq LINE_INPUT_handler ; LINE INPUT | |
A74F 8128 cmpa #$28 | |
A751 2709 beq L_A75C | |
A753 81C4 cmpa #$c4 ; token - | |
A755 2705 beq L_A75C | |
A757 C640 ldb #$40 | |
A759 BD89AC jsr CkChar ; optional @ before coords | |
A75C BDA71D L_A75C jsr L_A71D ; sets up $bd/$bf & $c3/$c5 | |
A75F 9EC3 ldx <$c3 ; with coords | |
A761 9FC7 stx <$c7 | |
A763 9EC5 ldx <$c5 | |
A765 9FC9 stx <$c9 | |
A767 BD89AA jsr CkComa ; check comma | |
A76A 81AD cmpa #$ad ; token PRESET | |
A76C 2709 beq L_A777 | |
A76E 81AC cmpa #$ac ; token PSET | |
A770 1026E240 lbne SN_error ; ?SN ERROR | |
A774 C601 ldb #$01 | |
A776 86 fcb $86 ; lda #$5f - comment byte | |
A777 5F L_A777 clrb ; usually skipped by comment byte | |
A778 3404 pshs b ; * (A777 5F CLRB) | |
A77A 9D9F jsr <$9f ; get next character from BASIC source | |
A77C BDA7AE jsr L_A7AE ; adjust coords for PMODE | |
A77F 3504 puls b | |
A781 D7C2 stb <$c2 ; PRESET / PSET flag | |
A783 BDA928 jsr L_A928 ; set up current colour | |
A786 9DA5 jsr <$a5 ; get current character from BASIC source | |
A788 102700A3 lbeq L_A82F ; must be a normal line | |
A78C BD89AA jsr CkComa ; check comma | |
A78F C642 ldb #$42 | |
A791 BD89AC jsr CkChar ; check for 'B' | |
A794 2621 bne L_A7B7 | |
A796 8D3A bsr L_A7D2 ; * draw empty rectangle | |
A798 8D62 bsr L_A7FC | |
A79A 9EBD ldx <$bd | |
A79C 3410 pshs x | |
A79E 9EC3 ldx <$c3 | |
A7A0 9FBD stx <$bd | |
A7A2 8D58 bsr L_A7FC | |
A7A4 3510 puls x | |
A7A6 9FBD stx <$bd | |
A7A8 9EC5 ldx <$c5 | |
A7AA 9FBF stx <$bf | |
A7AC 2024 bra L_A7D2 | |
A7AE BDA6AB L_A7AE jsr L_A6AB ; * adjust line's coords for current PMODE | |
A7B1 CE00C3 ldu #$00c3 | |
A7B4 7EA6AE jmp L_A6AE | |
A7B7 C646 L_A7B7 ldb #$46 ; * only 'F' allowed after 'B' | |
A7B9 BD89AC jsr CkChar | |
A7BC 2004 bra L_A7C2 | |
A7BE 301F L_A7BE leax -1,x | |
A7C0 9FBF L_A7C0 stx <$bf | |
A7C2 BDA7D2 L_A7C2 jsr L_A7D2 ; draw horizontal line | |
A7C5 9EBF ldx <$bf | |
A7C7 9CC5 cmpx <$c5 | |
A7C9 2706 beq L_A7D1 | |
A7CB 24F1 bcc L_A7BE ; next Y up or down? | |
A7CD 3001 leax 1,x | |
A7CF 20EF bra L_A7C0 | |
A7D1 39 L_A7D1 rts | |
A7D2 9EBD L_A7D2 ldx <$bd ; * draw horizontal line from left to right | |
A7D4 3410 pshs x | |
A7D6 BDAAB8 jsr L_AAB8 ; calc +ve difference in x ords | |
A7D9 2404 bcc L_A7DF | |
A7DB 9EC3 ldx <$c3 | |
A7DD 9FBD stx <$bd ; store lower of two values for calc | |
A7DF 1F02 L_A7DF tfr d,y | |
A7E1 3121 leay 1,y | |
A7E3 BDA626 jsr L_A626 ; calc pixel | |
A7E6 3540 puls u | |
A7E8 DFBD stu <$bd | |
A7EA 8D36 bsr L_A822 ; get address of pixel stepper in U | |
A7EC 97D7 L_A7EC sta <$d7 ; store pixel mask | |
A7EE BDA705 jsr L_A705 ; plot | |
A7F1 96D7 lda <$d7 | |
A7F3 ADC4 jsr ,u ; next pixel | |
A7F5 313F leay -1,y | |
A7F7 26F3 bne L_A7EC | |
A7F9 39 rts | |
A7FA 3506 L_A7FA puls a,b ; * jumped from general line routine | |
A7FC DCBF L_A7FC ldd <$bf ; * draw vertical line downwards | |
A7FE 3406 pshs a,b | |
A800 BDAAAB jsr L_AAAB ; +ve difference in Y ords | |
A803 2404 bcc L_A809 | |
A805 9EC5 ldx <$c5 | |
A807 9FBF stx <$bf | |
A809 1F02 L_A809 tfr d,y | |
A80B 3121 leay 1,y | |
A80D BDA626 jsr L_A626 ; call relevant pixel calc routine for PMODE | |
A810 3540 puls u | |
A812 DFBF stu <$bf | |
A814 8D15 bsr L_A82B | |
A816 20D4 bra L_A7EC | |
A818 A67BA682A67BA682A67B data_A818 fdb jmp_A67B,jmp_A682,jmp_A67B,jmp_A682,jmp_A67B ; * table of addresses of pixel step routines according to PMODE | |
A822 CEA818 L_A822 ldu #data_A818 ; * get address of pixel step routine according to PMODE | |
A825 D6B6 ldb <$b6 ; current PMODE | |
A827 58 lslb | |
A828 EEC5 ldu b,u | |
A82A 39 rts | |
A82B CEA677 L_A82B ldu #jmp_A677 ; * set U up with address of vertical pixel stepper | |
A82E 39 rts | |
A82F 108EA89B L_A82F ldy #jmp_A89B ; increment Y ord | |
A833 BDAAAB jsr L_AAAB ; +ve difference in Y ords | |
A836 1027FF98 lbeq L_A7D2 ; horizontal line | |
A83A 2404 bcc L_A840 ; draw left to right | |
A83C 108EA8A9 ldy #jmp_A8A9 ; decrement Y ord | |
A840 3406 L_A840 pshs a,b | |
A842 CEA894 ldu #jmp_A894 ; increment X ord | |
A845 BDAAB8 jsr L_AAB8 ; +ve difference in X ords | |
A848 27B0 beq L_A7FA ; vertical line | |
A84A 2403 bcc L_A84F ; draw top to bottom | |
A84C CEA8A2 ldu #jmp_A8A2 ; decrement X ord | |
A84F 10A3E4 L_A84F cmpd ,s | |
A852 3510 puls x | |
A854 2404 bcc L_A85A ; delta X >= delta Y | |
A856 1E32 exg u,y ; get main stepper in U | |
A858 1E01 exg d,x ; get larger delta in D | |
A85A 3446 L_A85A pshs a,b,u | |
A85C 3406 pshs a,b | |
A85E 44 lsra ; make initial total 1/2 of large | |
A85F 56 rorb ; delta for equal end segments | |
A860 2509 bcs L_A86B ; large delta was odd | |
A862 1183A89C cmpu #jmp_A89B + 1 | |
A866 2503 bcs L_A86B ; main stepper is in +ve direction | |
A868 830001 subd #$0001 ; mystery tweak | |
A86B 3416 L_A86B pshs a,b,x | |
A86D BDA61D jsr L_A61D ; get pixel calc in U | |
A870 ADC4 L_A870 jsr ,u | |
A872 BDA705 jsr L_A705 ; plot | |
A875 AE66 ldx 6,s | |
A877 2717 beq L_A890 | |
A879 301F leax -1,x | |
A87B AF66 stx 6,s ; dec counter | |
A87D ADF808 jsr [<$08,s] ; step pixel in main direction | |
A880 ECE4 ldd ,s | |
A882 E362 addd 2,s ; add small delta | |
A884 EDE4 std ,s ; to total | |
A886 A364 subd 4,s ; subtract larger delta | |
A888 25E6 bcs L_A870 ; threshold not reached | |
A88A EDE4 std ,s | |
A88C ADA4 jsr ,y ; step pixel in lesser direction | |
A88E 20E0 bra L_A870 | |
A890 3510 L_A890 puls x | |
A892 35F6 puls a,b,x,y,u,pc | |
A894 9EBD jmp_A894 ldx <$bd ; * increment X ord (LINE / PAINT) | |
A896 3001 leax 1,x | |
A898 9FBD stx <$bd | |
A89A 39 rts | |
A89B 9EBF jmp_A89B ldx <$bf ; * increment Y ord (LINE) | |
A89D 3001 leax 1,x | |
A89F 9FBF stx <$bf | |
A8A1 39 rts | |
A8A2 9EBD jmp_A8A2 ldx <$bd ; * decrement X ord (LINE / PAINT) | |
A8A4 301F leax -1,x | |
A8A6 9FBD stx <$bd | |
A8A8 39 rts | |
A8A9 9EBF jmp_A8A9 ldx <$bf ; * decrement Y ord (LINE) | |
A8AB 301F leax -1,x | |
A8AD 9FBF stx <$bf | |
A8AF 39 rts | |
A8B0 CE00D3 L_A8B0 ldu #$00d3 ; * sets up $d3 / $d5 with max coords adjusted for PMODE | |
A8B3 8E00FF ldx #$00ff | |
A8B6 AFC4 stx ,u | |
A8B8 8E00BF ldx #$00bf | |
A8BB AF42 stx 2,u | |
A8BD 7EA6AE jmp L_A6AE | |
A8C0 270E PCLS_dispatch beq L_A8D0 ; * PCLS | |
A8C2 8D24 bsr L_A8E8 | |
A8C4 8655 L_A8C4 lda #$55 | |
A8C6 3D mul | |
A8C7 9EBA pcls_B ldx <$ba ; start of current graphics | |
A8C9 E780 L_A8C9 stb ,x+ | |
A8CB 9CB7 cmpx <$b7 ; 1st byte after current graphics | |
A8CD 26FA bne L_A8C9 | |
A8CF 39 rts | |
A8D0 D6B3 L_A8D0 ldb <$b3 ; current background colour | |
A8D2 20F0 bra L_A8C4 | |
A8D4 812C COLOR_dispatch cmpa #$2c ; * COLOR | |
A8D6 2708 beq L_A8E0 | |
A8D8 8D0E bsr L_A8E8 | |
A8DA D7B2 stb <$b2 ; current foreground colour | |
A8DC 9DA5 jsr <$a5 ; get current character from BASIC source | |
A8DE 2707 beq L_A8E7 | |
A8E0 BD89AA L_A8E0 jsr CkComa ; check comma | |
A8E3 8D03 bsr L_A8E8 | |
A8E5 D7B3 stb <$b3 ; current background colour | |
A8E7 39 L_A8E7 rts | |
A8E8 BD8E51 L_A8E8 jsr Get8Bit ; get number in B | |
A8EB C109 L_A8EB cmpb #$09 | |
A8ED 1024E29C lbcc FC_error ; ?FC ERROR | |
A8F1 4F clra | |
A8F2 C105 cmpb #$05 | |
A8F4 2504 bcs L_A8FA | |
A8F6 8608 lda #$08 | |
A8F8 C004 subb #$04 | |
A8FA 3402 L_A8FA pshs a | |
A8FC 96B6 lda <$b6 ; current PMODE | |
A8FE 46 rora | |
A8FF 2408 bcc L_A909 | |
A901 5D tstb | |
A902 2602 bne L_A906 | |
A904 C604 L_A904 ldb #$04 | |
A906 5A L_A906 decb | |
A907 3582 L_A907 puls a,pc | |
A909 56 L_A909 rorb | |
A90A 25F8 bcs L_A904 | |
A90C 5F clrb | |
A90D 20F8 bra L_A907 | |
A90F BDA928 L_A90F jsr L_A928 ; set up colours | |
A912 9DA5 jsr <$a5 ; get current character from BASIC source | |
A914 2710 beq L_A926 | |
A916 8129 cmpa #$29 | |
A918 270C beq L_A926 | |
A91A BD89AA jsr CkComa ; check comma | |
A91D 812C cmpa #$2c | |
A91F 2705 beq L_A926 | |
A921 BDA8E8 jsr L_A8E8 | |
A924 8D0A bsr L_A930 | |
A926 0EA5 L_A926 jmp <$a5 ; get current character from BASIC source | |
A928 D6B2 L_A928 ldb <$b2 ; current foreground colour | |
A92A 0DC2 tst <$c2 ; PRESET / PSET flag | |
A92C 2602 bne L_A930 | |
A92E D6B3 ldb <$b3 ; current background colour | |
A930 D7B4 L_A930 stb <$b4 ; plot colour | |
A932 8655 lda #$55 | |
A934 3D mul | |
A935 D7B5 stb <$b5 ; byte value of plot colour | |
A937 39 rts | |
A938 2623 L_A938 bne L_A95D ; * called by SCREEN: sets up text or graphics according to Z | |
A93A 3416 reset_vdu pshs a,b,x ; * reset VDU | |
A93C 8EFFC8 ldx #$ffc8 | |
A93F A70A sta 10,x | |
A941 A708 sta 8,x | |
A943 A706 sta 6,x | |
A945 A704 sta 4,x | |
A947 A702 sta 2,x | |
A949 A701 sta 1,x | |
A94B A71E sta -2,x | |
A94D A71C sta -4,x | |
A94F A71A sta -6,x | |
A951 A718 sta -8,x | |
A953 B6FF22 lda >$ff22 | |
A956 8407 anda #$07 | |
A958 B7FF22 sta >$ff22 | |
A95B 3596 puls a,b,x,pc | |
A95D 3416 L_A95D pshs a,b,x ; * set up graphics display | |
A95F 96B6 lda <$b6 ; current PMODE | |
A961 8B03 adda #$03 | |
A963 C610 ldb #$10 | |
A965 3D mul | |
A966 CA80 orb #$80 | |
A968 DAC1 orb <$c1 ; current colour set | |
A96A B6FF22 lda >$ff22 | |
A96D 8407 anda #$07 | |
A96F 3402 pshs a | |
A971 EAE0 orb ,s+ | |
A973 F7FF22 stb >$ff22 | |
A976 96BA lda <$ba ; start of current graphics | |
A978 44 lsra | |
A979 BDA99D jsr L_A99D ; set up SAM VDG base | |
A97C 96B6 lda <$b6 ; current PMODE | |
A97E 8B03 adda #$03 | |
A980 8107 cmpa #$07 | |
A982 2601 bne L_A985 | |
A984 4A deca | |
A985 8D02 L_A985 bsr set_vdg_mode_A ; set up SAM VDG mem mode | |
A987 3596 puls a,b,x,pc | |
A989 C603 set_vdg_mode_A ldb #$03 ; * set up SAM VDG mode | |
A98B 8EFFC0 ldx #$ffc0 | |
A98E 46 L_A98E rora | |
A98F 2404 bcc L_A995 | |
A991 A701 sta 1,x | |
A993 2002 bra L_A997 | |
A995 A784 L_A995 sta ,x | |
A997 3002 L_A997 leax 2,x | |
A999 5A decb | |
A99A 26F2 bne L_A98E | |
A99C 39 rts | |
A99D C607 L_A99D ldb #$07 ; * set up VDG offset | |
A99F 8EFFC6 ldx #$ffc6 | |
A9A2 20EA bra L_A98E | |
A9A4 B6FF22 L_A9A4 lda >$ff22 ; * select VDG colour set | |
A9A7 84F7 anda #$f7 | |
A9A9 9AC1 ora <$c1 ; current colour set | |
A9AB B7FF22 sta >$ff22 | |
A9AE 39 rts | |
A9AF 812C PMODE_dispatch cmpa #$2c ; * PMODE | |
A9B1 272B beq L_A9DE | |
A9B3 BD8E51 jsr Get8Bit ; get number in B | |
A9B6 C105 cmpb #$05 | |
A9B8 2441 bcc do_fc_error_A9FB ; ?FC ERROR | |
A9BA 96BC lda <$bc ; MSB of start of graphics page 1 | |
A9BC 97BA sta <$ba ; start of current graphics | |
A9BE 58 lslb | |
A9BF CEAAA2 ldu #pmode_table + 1 ; PMODE setup table + 1 | |
A9C2 ABC5 adda b,u | |
A9C4 9119 cmpa <$19 ; start of BASIC program | |
A9C6 2233 bhi do_fc_error_A9FB ; ?FC ERROR | |
A9C8 97B7 sta <$b7 ; 1st byte after current graphics | |
A9CA 335F leau -1,u | |
A9CC A6C5 lda b,u | |
A9CE 97B9 sta <$b9 ; bytes per line in current graphics mode | |
A9D0 54 lsrb | |
A9D1 D7B6 stb <$b6 ; current PMODE | |
A9D3 4F clra | |
A9D4 97B3 sta <$b3 ; current background colour | |
A9D6 8603 lda #$03 | |
A9D8 97B2 sta <$b2 ; current foreground colour | |
A9DA 9DA5 jsr <$a5 ; get current character from BASIC source | |
A9DC 271C beq L_A9FA ; RTS | |
A9DE BD8E7E L_A9DE jsr L_8E7E ; skip comma & get number in B | |
A9E1 5D tstb | |
A9E2 2717 beq do_fc_error_A9FB ; ?FC ERROR | |
A9E4 5A decb | |
A9E5 8606 lda #$06 | |
A9E7 3D mul | |
A9E8 DBBC addb <$bc ; MSB of start of graphics page 1 | |
A9EA 3404 pshs b | |
A9EC DBB7 addb <$b7 ; 1st byte after current graphics | |
A9EE D0BA subb <$ba ; start of current graphics | |
A9F0 D119 cmpb <$19 ; start of BASIC program | |
A9F2 2207 bhi do_fc_error_A9FB ; ?FC ERROR | |
A9F4 D7B7 stb <$b7 ; 1st byte after current graphics | |
A9F6 3504 puls b | |
A9F8 D7BA stb <$ba ; start of current graphics | |
A9FA 39 L_A9FA rts | |
A9FB 7E8B8D do_fc_error_A9FB jmp FC_error ; ?FC ERROR | |
A9FE 812C SCREEN_dispatch cmpa #$2c ; * SCREEN | |
AA00 270B beq L_AA0D | |
AA02 BD8E51 jsr Get8Bit ; get number in B | |
AA05 5D tstb | |
AA06 BDA938 jsr L_A938 | |
AA09 9DA5 jsr <$a5 ; get current character from BASIC source | |
AA0B 27ED beq L_A9FA | |
AA0D BD8E7E L_AA0D jsr L_8E7E ; skip comma & get number in B | |
AA10 5D tstb | |
AA11 2702 beq L_AA15 | |
AA13 C608 ldb #$08 | |
AA15 D7C1 L_AA15 stb <$c1 ; current colour set | |
AA17 208B bra L_A9A4 | |
AA19 BD8E51 PCLEAR_dispatch jsr Get8Bit ; get number in B | |
AA1C 5D tstb | |
AA1D 27DC beq do_fc_error_A9FB ; ?FC ERROR | |
AA1F C109 cmpb #$09 | |
AA21 24D8 bcc do_fc_error_A9FB ; ?FC ERROR | |
AA23 8606 lda #$06 | |
AA25 3D mul | |
AA26 DBBC addb <$bc ; MSB of start of graphics page 1 | |
AA28 1F98 tfr b,a | |
AA2A C601 ldb #$01 | |
AA2C 1F02 tfr d,y | |
AA2E 1093B7 cmpd <$b7 ; 1st byte after current graphics | |
AA31 1025E158 lbcs FC_error ; ?FC ERROR | |
AA35 9319 subd <$19 ; start of BASIC program | |
AA37 D31B addd <$1b ; start of simple variables | |
AA39 1F01 tfr d,x | |
AA3B C300C8 addd #$00c8 | |
AA3E 9321 subd <$21 ; stack root / string storage start | |
AA40 24B9 bcc do_fc_error_A9FB ; ?FC ERROR | |
AA42 9668 lda <$68 ; current line number | |
AA44 4C inca | |
AA45 2708 beq L_AA4F | |
AA47 1F20 tfr y,d | |
AA49 9319 subd <$19 ; start of BASIC program | |
AA4B D3A6 addd <$a6 ; BASIC source pointer | |
AA4D DDA6 std <$a6 | |
AA4F DE1B L_AA4F ldu <$1b ; start of simple variables | |
AA51 9F1B stx <$1b | |
AA53 11931B cmpu <$1b | |
AA56 2417 bcc L_AA6F | |
AA58 A6C2 L_AA58 lda ,-u | |
AA5A A782 sta ,-x | |
AA5C 119319 cmpu <$19 ; start of BASIC program | |
AA5F 26F7 bne L_AA58 | |
AA61 109F19 sty <$19 ; start of BASIC program | |
AA64 6F3F clr -1,y | |
AA66 BD83ED L_AA66 jsr BasVect2 ; set up next line pointers in BASIC program | |
AA69 BD8424 jsr L_8424 ; clear variables & reset stack | |
AA6C 7E849F jmp run_basic ; interpreter loop | |
AA6F DE19 L_AA6F ldu <$19 ; start of BASIC program | |
AA71 109F19 sty <$19 | |
AA74 6F3F clr -1,y | |
AA76 A6C0 L_AA76 lda ,u+ | |
AA78 A7A0 sta ,y+ | |
AA7A 109C1B cmpy <$1b ; start of simple variables | |
AA7D 26F7 bne L_AA76 | |
AA7F 20E5 bra L_AA66 | |
AA81 C61E L_AA81 ldb #$1e ; * called by reset routine to PCLEAR 4 | |
AA83 D719 stb <$19 ; start of BASIC program | |
AA85 8606 lda #$06 | |
AA87 97BC sta <$bc ; MSB of start of graphics page 1 | |
AA89 97BA sta <$ba ; start of current graphics | |
AA8B 4F clra | |
AA8C 97B6 sta <$b6 ; current PMODE | |
AA8E 8610 lda #$10 | |
AA90 97B9 sta <$b9 ; bytes per line in current graphics mode | |
AA92 8603 lda #$03 | |
AA94 97B2 sta <$b2 ; current foreground colour | |
AA96 860C lda #$0c | |
AA98 97B7 sta <$b7 ; 1st byte after current graphics | |
AA9A 9E19 ldx <$19 ; start of BASIC program | |
AA9C 6F1F clr -1,x | |
AA9E 7E8417 jmp erase_basic ; NEW BASIC | |
AAA1 1006200C100C20182018 pmode_table fcb $10,$06,$20,$0c,$10,$0c,$20,$18,$20,$18 ; * PMODE setup table: bytes/line + MSB of display size | |
AAAB DCC5 L_AAAB ldd <$c5 ; * calc +ve difference in Y ords | |
AAAD 93BF subd <$bf | |
AAAF 243B L_AAAF bcc L_AAEC | |
AAB1 3401 pshs cc | |
AAB3 BDB15E jsr L_B15E ; D = -D | |
AAB6 3581 puls cc,pc | |
AAB8 DCC3 L_AAB8 ldd <$c3 ; * calc +ve difference in X ords | |
AABA 93BD subd <$bd | |
AABC 20F1 bra L_AAAF | |
AABE 8D1A PCOPY_dispatch bsr L_AADA ; * PCOPY | |
AAC0 3406 pshs a,b | |
AAC2 C6BC ldb #$bc | |
AAC4 BD89AC jsr CkChar ; check for token TO | |
AAC7 8D11 bsr L_AADA | |
AAC9 3510 puls x | |
AACB 1F03 tfr d,u | |
AACD 108E0300 ldy #$0300 | |
AAD1 EC81 L_AAD1 ldd ,x++ | |
AAD3 EDC1 std ,u++ | |
AAD5 313F leay -1,y | |
AAD7 26F8 bne L_AAD1 | |
AAD9 39 rts | |
AADA BD8E51 L_AADA jsr Get8Bit ; get number in B | |
AADD 5D tstb | |
AADE 270D beq do_fc_error_AAED ; ?FC ERROR | |
AAE0 5A decb | |
AAE1 8606 lda #$06 | |
AAE3 3D mul | |
AAE4 DBBC addb <$bc ; MSB of start of graphics page 1 | |
AAE6 D119 cmpb <$19 ; page address must be lower | |
AAE8 2403 bcc do_fc_error_AAED ; than BASIC program | |
AAEA 1E89 exg a,b | |
AAEC 39 L_AAEC rts | |
AAED 7E8B8D do_fc_error_AAED jmp FC_error ; ?FC ERROR | |
AAF0 5F GET_dispatch clrb ; * GET | |
AAF1 2002 bra L_AAF5 | |
AAF3 C601 PUT_dispatch ldb #$01 ; * PUT | |
AAF5 D7D8 L_AAF5 stb <$d8 | |
AAF7 BD01A0 jsr >$01a0 ; PATCH - CLS GET PUT | |
AAFA 8140 cmpa #$40 | |
AAFC 2602 bne L_AB00 ; optional @ before coords | |
AAFE 9D9F jsr <$9f ; get next character from BASIC source | |
AB00 BDA71D L_AB00 jsr L_A71D ; get coords into $bd/$bf & $c3/$c5 | |
AB03 BD89AA jsr CkComa ; check comma | |
AB06 BDAC67 jsr L_AC67 ; validate & get varptr of array | |
AB09 1F10 tfr x,d | |
AB0B EE84 ldu ,x | |
AB0D 335E leau -2,u | |
AB0F 33CB leau d,u | |
AB11 DFD1 stu <$d1 ; address of last byte of array+1 | |
AB13 3002 leax 2,x | |
AB15 E684 ldb ,x ; no. of dimensions | |
AB17 58 lslb | |
AB18 3A abx | |
AB19 9FCF stx <$cf ; address of first byte of array | |
AB1B 9606 lda <$06 ; string arrays not allowed | |
AB1D 26CE bne do_fc_error_AAED ; ?FC ERROR | |
AB1F 0FD4 clr <$d4 | |
AB21 9DA5 jsr <$a5 ; get current character from BASIC source | |
AB23 272D beq L_AB52 ; no parameter after array | |
AB25 03D4 com <$d4 | |
AB27 BD89AA jsr CkComa ; check comma | |
AB2A 0DD8 tst <$d8 | |
AB2C 2607 bne L_AB35 ; PUT | |
AB2E C647 ldb #$47 | |
AB30 BD89AC jsr CkChar ; skip G | |
AB33 2030 bra L_AB65 ; GET ,G | |
AB35 C605 L_AB35 ldb #$05 | |
AB37 8EABD4 ldx #data_ABD4 | |
AB3A EE81 L_AB3A ldu ,x++ ; set up action routines for PUT | |
AB3C 10AE81 ldy ,x++ | |
AB3F A180 cmpa ,x+ | |
AB41 2706 beq L_AB49 | |
AB43 5A decb | |
AB44 26F4 bne L_AB3A | |
AB46 7E89B4 jmp SN_error ; ?SN ERROR | |
AB49 109FD5 L_AB49 sty <$d5 | |
AB4C DFD9 stu <$d9 | |
AB4E 9D9F jsr <$9f ; get next character from BASIC source | |
AB50 2013 bra L_AB65 | |
AB52 C6F8 L_AB52 ldb #$f8 ; * bytewise GET / PUT | |
AB54 96B6 lda <$b6 ; current PMODE | |
AB56 46 rora | |
AB57 2402 bcc L_AB5B ; 2 colour modes | |
AB59 C6FC ldb #$fc | |
AB5B 1F98 L_AB5B tfr b,a | |
AB5D D4BE andb <$be ; adjust horizontal coords to align with bytes | |
AB5F D7BE stb <$be | |
AB61 94C4 anda <$c4 | |
AB63 97C4 sta <$c4 | |
AB65 BDAAB8 L_AB65 jsr L_AAB8 ; calc +ve difference in x ords | |
AB68 2404 bcc L_AB6E ; 1st is less than 2nd | |
AB6A 9EC3 ldx <$c3 | |
AB6C 9FBD stx <$bd | |
AB6E DDC3 L_AB6E std <$c3 ; x ord difference | |
AB70 BDAAAB jsr L_AAAB ; +ve difference in Y ords | |
AB73 2404 bcc L_AB79 ; 1st is less than 2nd | |
AB75 9EC5 ldx <$c5 | |
AB77 9FBF stx <$bf | |
AB79 DDC5 L_AB79 std <$c5 ; y ord difference | |
AB7B 96B6 lda <$b6 ; current PMODE | |
AB7D 46 rora | |
AB7E DCC3 ldd <$c3 | |
AB80 2404 bcc L_AB86 ; 2 colour modes | |
AB82 D3C3 addd <$c3 | |
AB84 DDC3 std <$c3 | |
AB86 BDA7AE L_AB86 jsr L_A7AE ; adjust coords for PMODE | |
AB89 DCC3 ldd <$c3 | |
AB8B 9EC5 ldx <$c5 | |
AB8D 3001 leax 1,x | |
AB8F 9FC5 stx <$c5 ; add 1 to y difference to get height | |
AB91 0DD4 tst <$d4 | |
AB93 2658 bne L_ABED ; action specified | |
AB95 44 lsra | |
AB96 56 rorb | |
AB97 44 lsra | |
AB98 56 rorb | |
AB99 44 lsra | |
AB9A 56 rorb | |
AB9B C30001 addd #$0001 | |
AB9E DDC3 std <$c3 ; width of image in bytes | |
ABA0 BDA626 jsr L_A626 ; call relevant pixel calc routine for PMODE | |
ABA3 D6C4 L_ABA3 ldb <$c4 | |
ABA5 3410 pshs x | |
ABA7 0DD8 L_ABA7 tst <$d8 | |
ABA9 2721 beq L_ABCC ; GET | |
ABAB 8D11 bsr L_ABBE ; increment array pointer (U) | |
ABAD A6C4 lda ,u | |
ABAF A780 sta ,x+ | |
ABB1 5A L_ABB1 decb | |
ABB2 26F3 bne L_ABA7 ; repeat until line done | |
ABB4 3510 puls x | |
ABB6 BDA677 jsr jmp_A677 ; move X one line down for all PMODEs | |
ABB9 0AC6 dec <$c6 | |
ABBB 26E6 bne L_ABA3 ; another line | |
ABBD 39 L_ABBD rts | |
ABBE DECF L_ABBE ldu <$cf ; * increment array pointer (U) | |
ABC0 3341 leau 1,u | |
ABC2 DFCF stu <$cf | |
ABC4 1193D1 cmpu <$d1 | |
ABC7 26F4 bne L_ABBD ; RTS | |
ABC9 7E8B8D do_fc_error_ABC9 jmp FC_error ; ?FC ERROR | |
ABCC A680 L_ABCC lda ,x+ ; * action for GET without G parameter | |
ABCE 8DEE bsr L_ABBE ; increment array pointer (U) | |
ABD0 A7C4 sta ,u | |
ABD2 20DD bra L_ABB1 | |
ABD4 AC2FAC36 data_ABD4 fdb PUT_handle_0,PUT_handle_1 ; PSET | |
ABD8 AC fcb $ac | |
ABD9 AC36AC2F fdb PUT_handle_1,PUT_handle_0 ; PRESET | |
ABDD AD fcb $ad | |
ABDE AC4CAC36 fdb PUT_handle_3,PUT_handle_1 ; OR | |
ABE2 C9 fcb $c9 | |
ABE3 AC2FAC4C fdb PUT_handle_0,PUT_handle_3 ; AND | |
ABE7 C8 fcb $c8 | |
ABE8 AC3CAC3C fdb PUT_handle_2,PUT_handle_2 ; NOT | |
ABEC C0 fcb $c0 | |
ABED C30001 L_ABED addd #$0001 ; * GET(G) & PUT(action) - does it bitwise | |
ABF0 DDC3 std <$c3 ; width of image in bits | |
ABF2 96D8 lda <$d8 | |
ABF4 2609 bne L_ABFF ; PUT | |
ABF6 DED1 ldu <$d1 | |
ABF8 A7C2 L_ABF8 sta ,-u ; clear array for GET | |
ABFA 1193CF cmpu <$cf | |
ABFD 22F9 bhi L_ABF8 | |
ABFF BDA626 L_ABFF jsr L_A626 ; call relevant pixel calc routine for PMODE | |
AC02 D6B6 ldb <$b6 ; current PMODE | |
AC04 56 rorb | |
AC05 2402 bcc L_AC09 ; 2 colour modes | |
AC07 84AA anda #$aa ; reduce mask to single bit | |
AC09 C601 L_AC09 ldb #$01 | |
AC0B 109ECF ldy <$cf | |
AC0E 3412 L_AC0E pshs a,x | |
AC10 DEC3 ldu <$c3 ; U = image width in bits | |
AC12 3442 L_AC12 pshs a,u | |
AC14 54 lsrb ; step array bit pointer | |
AC15 2408 bcc L_AC1F | |
AC17 56 rorb ; B = $80 | |
AC18 3121 leay 1,y ; filled an array byte, so point to next one | |
AC1A 109CD1 cmpy <$d1 ; test for end of array | |
AC1D 27AA beq do_fc_error_ABC9 ; ?FC ERROR | |
AC1F 0DD8 L_AC1F tst <$d8 | |
AC21 271F beq L_AC42 ; GET | |
AC23 E5A4 bitb ,y ; test array bit | |
AC25 2704 beq L_AC2B | |
AC27 6E9F00D5 jmp [$00d5] ; action if array bit set | |
AC2B 6E9F00D9 L_AC2B jmp [$00d9] ; action if array bit clear | |
AC2F 43 PUT_handle_0 coma ; * action for PSET 0, PRESET 1, AND 0 | |
AC30 A484 anda ,x | |
AC32 A784 sta ,x ; clear screen bit | |
AC34 2016 bra PUT_handle_3 ; next bit | |
AC36 AA84 PUT_handle_1 ora ,x ; * action for PSET 1, PRESET 0, OR 1 | |
AC38 A784 sta ,x ; set screen bit | |
AC3A 2010 bra PUT_handle_3 ; next bit | |
AC3C A884 PUT_handle_2 eora ,x ; * action for NOT 0, NOT 1 | |
AC3E A784 sta ,x ; invert screen bit | |
AC40 200A bra PUT_handle_3 ; next bit | |
AC42 A584 L_AC42 bita ,x ; test screen bit | |
AC44 2706 beq PUT_handle_3 ; don't set array bit - next pixel | |
AC46 1F98 tfr b,a | |
AC48 AAA4 ora ,y | |
AC4A A7A4 sta ,y ; set array bit | |
AC4C 3542 PUT_handle_3 puls a,u ; pixel mask & width counter | |
AC4E BDA67B jsr jmp_A67B ; step bit one to right | |
AC51 335F leau -1,u | |
AC53 11938A cmpu <$8a ; zero | |
AC56 26BA bne L_AC12 ; not end of line | |
AC58 AE61 ldx 1,s | |
AC5A 96B9 lda <$b9 ; bytes per line in current graphics mode | |
AC5C 3086 leax a,x ; point X to next line | |
AC5E 3502 puls a | |
AC60 3262 leas 2,s | |
AC62 0AC6 dec <$c6 | |
AC64 26A8 bne L_AC0E ; do another line | |
AC66 39 rts | |
AC67 BD8A94 L_AC67 jsr GETVAR ; get varptr address | |
AC6A E682 ldb ,-x | |
AC6C A682 lda ,-x | |
AC6E 1F03 tfr d,u ; get variable name in U | |
AC70 9E1D ldx <$1d | |
AC72 9C1F L_AC72 cmpx <$1f | |
AC74 1027DF15 lbeq FC_error ; ?FC ERROR | |
AC78 11A384 cmpu ,x ; search array storage to ensure | |
AC7B 2706 beq L_AC83 ; that specified variable is an | |
AC7D EC02 ldd 2,x ; array | |
AC7F 308B leax d,x | |
AC81 20EF bra L_AC72 | |
AC83 3002 L_AC83 leax 2,x ; varptr | |
AC85 39 rts | |
AC86 39 L_AC86 rts | |
AC87 8140 PAINT_dispatch cmpa #$40 ; * PAINT | |
AC89 2602 bne L_AC8D ; optional @ before coords | |
AC8B 9D9F jsr <$9f ; get next character from BASIC source | |
AC8D BDA740 L_AC8D jsr L_A740 ; get coords into $bd / $bf | |
AC90 BDA6AB jsr L_A6AB ; adjust coords for PMODE | |
AC93 8601 lda #$01 | |
AC95 97C2 sta <$c2 ; PRESET / PSET flag | |
AC97 BDA90F jsr L_A90F ; read optional colour | |
AC9A DCB4 ldd <$b4 ; plot colour | |
AC9C 3406 pshs a,b | |
AC9E 9DA5 jsr <$a5 ; get current character from BASIC source | |
ACA0 2703 beq L_ACA5 | |
ACA2 BDA90F jsr L_A90F ; read optional colour | |
ACA5 96B5 L_ACA5 lda <$b5 ; byte value of plot colour | |
ACA7 97D8 sta <$d8 | |
ACA9 3506 puls a,b | |
ACAB DDB4 std <$b4 ; plot colour | |
ACAD 4F clra | |
ACAE 3456 pshs a,b,x,u | |
ACB0 BDA8B0 jsr L_A8B0 ; set up max coords for PMODE | |
ACB3 BDA61D jsr L_A61D ; get address of pixel calc routine | |
ACB6 DFD9 stu <$d9 ; pixel calc | |
ACB8 BDAD7A jsr L_AD7A ; paint left & count pixels in U, D & X | |
ACBB 270F beq L_ACCC ; none painted | |
ACBD BDAD66 jsr L_AD66 ; paint right after previous left | |
ACC0 8601 lda #$01 | |
ACC2 97D7 sta <$d7 | |
ACC4 BDAD55 jsr L_AD55 ; save pos on stack | |
ACC7 00D7 neg <$d7 | |
ACC9 BDAD55 jsr L_AD55 ; save pos on stack | |
ACCC 10DFDC L_ACCC sts <$dc | |
ACCF 0DDB L_ACCF tst <$db ; * (main loop) | |
ACD1 2603 bne L_ACD6 ; pixels were painted on previous line | |
ACD3 10DEDC lds <$dc | |
ACD6 3556 L_ACD6 puls a,b,x,u | |
ACD8 0FDB clr <$db ; pixel changed flag (updated by plot) | |
ACDA 10DFDC sts <$dc | |
ACDD 3001 leax 1,x | |
ACDF 9FBD stx <$bd ; current x pos | |
ACE1 DFD1 stu <$d1 ; no. of pixels painted on previous line | |
ACE3 97D7 sta <$d7 ; up / down flag | |
ACE5 279F beq L_AC86 ; RTS - pulled final stack entry | |
ACE7 2B06 bmi L_ACEF ; paint up | |
ACE9 5C incb | |
ACEA D1D6 cmpb <$d6 | |
ACEC 2305 bls L_ACF3 ; not off bottom of screen | |
ACEE 5F clrb | |
ACEF 5D L_ACEF tstb | |
ACF0 27DD beq L_ACCF ; at top/bottom of screen | |
ACF2 5A decb | |
ACF3 D7C0 L_ACF3 stb <$c0 | |
ACF5 BDAD7A jsr L_AD7A ; paint left & count pixels in U, D & X | |
ACF8 270F beq L_AD09 ; none painted | |
ACFA 10830003 cmpd #$0003 | |
ACFE 2504 bcs L_AD04 ; only 1 or 2 pixels painted | |
AD00 301E leax -2,x | |
AD02 8D38 bsr L_AD3C ; save pos on stack with reverse direction | |
AD04 BDAD66 L_AD04 jsr L_AD66 ; paint right after previous left | |
AD07 8D4C L_AD07 bsr L_AD55 ; save pos on stack | |
AD09 43 L_AD09 coma | |
AD0A 53 comb | |
AD0B D3D1 L_AD0B addd <$d1 | |
AD0D DDD1 std <$d1 | |
AD0F 2F16 ble L_AD27 | |
AD11 BDA894 jsr jmp_A894 ; increment X ord | |
AD14 BDADAD jsr L_ADAD ; calc pixel & test for border colour | |
AD17 2605 bne L_AD1E | |
AD19 CCFFFF ldd #$ffff | |
AD1C 20ED bra L_AD0B | |
AD1E BDA8A2 L_AD1E jsr jmp_A8A2 ; decrement X ord | |
AD21 8D3E bsr L_AD61 ; copy X ord to $c3 | |
AD23 8D5E bsr L_AD83 ; paint right & count pixels in U, D & X | |
AD25 20E0 bra L_AD07 | |
AD27 BDA894 L_AD27 jsr jmp_A894 ; increment X ord | |
AD2A 308B leax d,x | |
AD2C 9FBD stx <$bd | |
AD2E 43 coma | |
AD2F 53 comb | |
AD30 830001 subd #$0001 | |
AD33 2F04 ble L_AD39 | |
AD35 1F01 tfr d,x | |
AD37 8D03 bsr L_AD3C ; save pos on stack with reverse direction | |
AD39 7EACCF L_AD39 jmp L_ACCF ; loop again | |
AD3C DDCB L_AD3C std <$cb ; * save pos with reverse direction | |
AD3E 3520 puls y | |
AD40 DCBD ldd <$bd | |
AD42 3416 pshs a,b,x | |
AD44 96D7 lda <$d7 | |
AD46 40 nega | |
AD47 D6C0 L_AD47 ldb <$c0 | |
AD49 3406 pshs a,b | |
AD4B 3420 pshs y | |
AD4D C602 ldb #$02 | |
AD4F BD8331 jsr L_8331 ; memory check | |
AD52 DCCB ldd <$cb | |
AD54 39 rts | |
AD55 DDCB L_AD55 std <$cb ; * save pos on stack | |
AD57 3520 puls y | |
AD59 DCC3 ldd <$c3 | |
AD5B 3416 pshs a,b,x | |
AD5D 96D7 lda <$d7 | |
AD5F 20E6 bra L_AD47 | |
AD61 9EBD L_AD61 ldx <$bd ; * copy X ord to $c3 | |
AD63 9FC3 stx <$c3 | |
AD65 39 rts | |
AD66 DDCD L_AD66 std <$cd ; * D = no. of pixels painted right + 1 | |
AD68 109EC3 ldy <$c3 | |
AD6B 8DF4 bsr L_AD61 ; copy X ord to $c3 | |
AD6D 109FBD sty <$bd | |
AD70 8D11 bsr L_AD83 ; paint right & count pixels in U, D & X | |
AD72 9ECD ldx <$cd | |
AD74 308B leax d,x | |
AD76 C30001 addd #$0001 | |
AD79 39 rts | |
AD7A BDAD61 L_AD7A jsr L_AD61 ; copy X ord to $c3 | |
AD7D 108EA8A2 ldy #jmp_A8A2 ; decrement X ord | |
AD81 2006 bra L_AD89 | |
AD83 108EA894 L_AD83 ldy #jmp_A894 ; increment X ord | |
AD87 ADA4 jsr ,y ; step X ord | |
AD89 DE8A L_AD89 ldu <$8a ; zero | |
AD8B 9EBD ldx <$bd | |
AD8D 2B17 L_AD8D bmi L_ADA6 ; < min X | |
AD8F 9CD3 cmpx <$d3 | |
AD91 2213 bhi L_ADA6 ; > max X | |
AD93 3460 pshs y,u | |
AD95 8D16 bsr L_ADAD ; calc pixel & test for border colour | |
AD97 270B beq L_ADA4 | |
AD99 BDA705 jsr L_A705 ; plot | |
AD9C 3560 puls y,u | |
AD9E 3341 leau 1,u | |
ADA0 ADA4 jsr ,y ; step X ord | |
ADA2 20E9 bra L_AD8D | |
ADA4 3560 L_ADA4 puls y,u | |
ADA6 1F30 L_ADA6 tfr u,d | |
ADA8 1F01 tfr d,x | |
ADAA 938A subd <$8a ; CMPD #0 | |
ADAC 39 rts | |
ADAD AD9F00D9 L_ADAD jsr [$00d9] ; pixel calc | |
ADB1 1F89 tfr a,b | |
ADB3 D4D8 andb <$d8 | |
ADB5 3406 pshs a,b | |
ADB7 A484 anda ,x | |
ADB9 A161 cmpa 1,s | |
ADBB 3586 puls a,b,pc | |
ADBD 9E8A PLAY_dispatch ldx <$8a ; zero | |
ADBF C601 ldb #$01 | |
ADC1 3414 pshs b,x | |
ADC3 BD8887 jsr get_string ; get expression | |
ADC6 5F clrb | |
ADC7 BDBAF1 jsr L_BAF1 ; B=0 to select d/a sound | |
ADCA BDBAC5 jsr L_BAC5 ; enable audio | |
ADCD BD8D9A L_ADCD jsr L_8D9A ; validate string & point X to it (len in B) | |
ADD0 2002 bra L_ADD4 | |
ADD2 3514 L_ADD2 puls b,x | |
ADD4 D7D8 L_ADD4 stb <$d8 ; string length | |
ADD6 27FA beq L_ADD2 | |
ADD8 9FD9 stx <$d9 ; 1st byte in string | |
ADDA 10270CE5 lbeq L_BAC3 ; nothing to do - disable audio & quit | |
ADDE 0DD8 L_ADDE tst <$d8 ; remaining string length | |
ADE0 27F0 beq L_ADD2 | |
ADE2 BDAF33 jsr L_AF33 ; get character | |
ADE5 813B cmpa #$3b | |
ADE7 27F5 beq L_ADDE | |
ADE9 8127 cmpa #$27 | |
ADEB 27F1 beq L_ADDE | |
ADED 8158 cmpa #$58 | |
ADEF 102701B2 lbeq L_AFA5 ; execute substring | |
ADF3 8D02 bsr L_ADF7 ; interpret meta-command | |
ADF5 20E7 bra L_ADDE | |
ADF7 814F L_ADF7 cmpa #$4f ; * change octave | |
ADF9 260D bne L_AE08 | |
ADFB D6DE ldb <$de ; PLAY octave | |
ADFD 5C incb | |
ADFE 8D5B bsr L_AE5B ; modify B according to PLAY parameter | |
AE00 5A decb | |
AE01 C104 cmpb #$04 | |
AE03 2263 bhi do_fc_error_AE68 ; ?FC ERROR | |
AE05 D7DE stb <$de ; PLAY octave | |
AE07 39 rts | |
AE08 8156 L_AE08 cmpa #$56 ; * change volume | |
AE0A 261A bne L_AE26 | |
AE0C D6DF ldb <$df ; PLAY d/a high value | |
AE0E 54 lsrb | |
AE0F 54 lsrb | |
AE10 C01F subb #$1f | |
AE12 8D47 bsr L_AE5B ; modify B according to PLAY parameter | |
AE14 C11F cmpb #$1f | |
AE16 2250 bhi do_fc_error_AE68 ; ?FC ERROR | |
AE18 58 lslb | |
AE19 58 lslb | |
AE1A 3404 pshs b | |
AE1C CC7E7C ldd #$7e7c | |
AE1F ABE4 adda ,s | |
AE21 E0E0 subb ,s+ | |
AE23 DDDF std <$df ; PLAY volume data | |
AE25 39 rts | |
AE26 814C L_AE26 cmpa #$4c ; * change note length | |
AE28 2623 bne L_AE4D | |
AE2A D6E1 ldb <$e1 ; PLAY note length | |
AE2C 8D2D bsr L_AE5B ; modify B according to PLAY parameter | |
AE2E 5D tstb | |
AE2F 2737 beq do_fc_error_AE68 ; ?FC ERROR | |
AE31 D7E1 stb <$e1 ; PLAY note length | |
AE33 0FE5 clr <$e5 ; duration modifier (no. of dots) | |
AE35 8D03 L_AE35 bsr L_AE3A | |
AE37 24FC bcc L_AE35 | |
AE39 39 rts | |
AE3A 0DD8 L_AE3A tst <$d8 ; remaining string length | |
AE3C 270A beq L_AE48 | |
AE3E BDAF33 jsr L_AF33 ; get character | |
AE41 812E cmpa #$2e | |
AE43 2705 beq L_AE4A | |
AE45 BDAF7D jsr L_AF7D ; move string pointer back one | |
AE48 43 L_AE48 coma | |
AE49 39 rts | |
AE4A 0CE5 L_AE4A inc <$e5 ; duration modifier (no. of dots) | |
AE4C 39 rts | |
AE4D 8154 L_AE4D cmpa #$54 ; * change tempo | |
AE4F 260D bne L_AE5E | |
AE51 D6E2 ldb <$e2 ; PLAY tempo | |
AE53 8D06 bsr L_AE5B ; modify B according to PLAY parameter | |
AE55 5D tstb | |
AE56 2710 beq do_fc_error_AE68 ; ?FC ERROR | |
AE58 D7E2 stb <$e2 ; PLAY tempo | |
AE5A 39 rts | |
AE5B 7EAF47 L_AE5B jmp L_AF47 ; * change a PLAY parameter (modifies value in B) | |
AE5E 8150 L_AE5E cmpa #$50 ; * play a pause | |
AE60 2624 bne L_AE86 | |
AE62 BDB066 jsr L_B066 ; check for number or =variable (get into B) | |
AE65 5D tstb | |
AE66 2603 bne L_AE6B | |
AE68 7E8B8D do_fc_error_AE68 jmp FC_error ; ?FC ERROR | |
AE6B 96E5 L_AE6B lda <$e5 ; duration modifier (no. of dots) | |
AE6D 9EDF ldx <$df ; PLAY volume data | |
AE6F 3412 pshs a,x | |
AE71 867C lda #$7c | |
AE73 97DF sta <$df ; PLAY d/a high value | |
AE75 97E0 sta <$e0 ; PLAY d/a low value | |
AE77 0FE5 clr <$e5 ; duration modifier (no. of dots) | |
AE79 8D07 bsr L_AE82 | |
AE7B 3512 puls a,x | |
AE7D 97E5 sta <$e5 ; duration modifier (no. of dots) | |
AE7F 9FDF stx <$df ; PLAY volume data | |
AE81 39 rts | |
AE82 6FE2 L_AE82 clr ,-s | |
AE84 2040 bra L_AEC6 | |
AE86 814E L_AE86 cmpa #$4e ; * ignore an N! | |
AE88 2603 bne L_AE8D | |
AE8A BDAF33 jsr L_AF33 ; get character | |
AE8D 8141 L_AE8D cmpa #$41 | |
AE8F 2504 bcs L_AE95 | |
AE91 8147 cmpa #$47 | |
AE93 2305 bls play_note_A | |
AE95 BDAF59 L_AE95 jsr L_AF59 ; check for number or =variable (get into B) | |
AE98 2023 bra L_AEBD | |
AE9A 8041 play_note_A suba #$41 | |
AE9C 8EAFF6 ldx #data_AFF6 ; note number XLAT table | |
AE9F E686 ldb a,x ; XLAT into number | |
AEA1 0DD8 tst <$d8 ; remaining string length | |
AEA3 2718 beq L_AEBD | |
AEA5 BDAF33 jsr L_AF33 ; get character | |
AEA8 8123 cmpa #$23 | |
AEAA 2704 beq L_AEB0 | |
AEAC 812B cmpa #$2b | |
AEAE 2603 bne L_AEB3 | |
AEB0 5C L_AEB0 incb ; sharpen note | |
AEB1 200A bra L_AEBD | |
AEB3 812D L_AEB3 cmpa #$2d | |
AEB5 2603 bne L_AEBA | |
AEB7 5A decb ; flatten note | |
AEB8 2003 bra L_AEBD | |
AEBA BDAF7D L_AEBA jsr L_AF7D ; move string pointer back one | |
AEBD 5A L_AEBD decb | |
AEBE C10B cmpb #$0b | |
AEC0 22A6 bhi do_fc_error_AE68 ; ?FC ERROR | |
AEC2 3404 pshs b | |
AEC4 D6E1 ldb <$e1 ; PLAY note length | |
AEC6 96E2 L_AEC6 lda <$e2 ; PLAY tempo | |
AEC8 3D mul | |
AEC9 DDD5 std <$d5 ; PLAY duration decrement value | |
AECB 3361 leau 1,s ; point U to return address ($ADF5) | |
AECD 96DE lda <$de ; PLAY octave | |
AECF 8101 cmpa #$01 | |
AED1 222C bhi L_AEFF | |
AED3 8EAFFD ldx #data_AFFD ; pitch XLAT table for octaves 1 & 2 | |
AED6 C618 ldb #$18 | |
AED8 3D mul | |
AED9 3A abx | |
AEDA 3504 puls b | |
AEDC 58 lslb | |
AEDD 3A abx | |
AEDE 3184 leay ,x ; XLAT note for octaves 1 & 2 | |
AEE0 8D45 bsr L_AF27 ; compute PLAY duration | |
AEE2 DDE3 std <$e3 ; PLAY duration counter | |
AEE4 8D0C L_AEE4 bsr L_AEF2 ; zero d/a | |
AEE6 96DF lda <$df ; PLAY d/a high value | |
AEE8 8D0B bsr L_AEF5 ; set d/a | |
AEEA 8D06 bsr L_AEF2 ; zero d/a | |
AEEC 96E0 lda <$e0 ; PLAY d/a low value | |
AEEE 8D05 bsr L_AEF5 ; set d/a | |
AEF0 20F2 bra L_AEE4 ; irq routine controls duration | |
AEF2 867C L_AEF2 lda #$7c ; * ;forces jump to $adf5 | |
AEF4 12 nop | |
AEF5 B7FF20 L_AEF5 sta >$ff20 | |
AEF8 AEA4 ldx ,y | |
AEFA 301F L_AEFA leax -1,x | |
AEFC 26FC bne L_AEFA | |
AEFE 39 rts | |
AEFF 8EB015 L_AEFF ldx #data_B015 ; XLAT table for octaves 3 - 5 (-$18) | |
AF02 C60C ldb #$0c | |
AF04 3D mul | |
AF05 3A abx | |
AF06 3504 puls b | |
AF08 3A abx ; XLAT note for octaves 3 - 5 | |
AF09 8D1C bsr L_AF27 ; compute PLAY duration | |
AF0B DDE3 std <$e3 ; PLAY duration counter | |
AF0D 8D0C L_AF0D bsr L_AF1B ; zero d/a | |
AF0F 96DF lda <$df ; PLAY d/a high value | |
AF11 8D0B bsr L_AF1E ; set d/a | |
AF13 8D06 bsr L_AF1B ; zero d/a | |
AF15 96E0 lda <$e0 ; PLAY d/a low value | |
AF17 8D05 bsr L_AF1E ; set d/a | |
AF19 20F2 bra L_AF0D ; irq routine controls duration | |
AF1B 867C L_AF1B lda #$7c ; * ;forces jump to $adf5 | |
AF1D 12 nop | |
AF1E B7FF20 L_AF1E sta >$ff20 | |
AF21 A684 lda ,x | |
AF23 4A L_AF23 deca | |
AF24 26FD bne L_AF23 | |
AF26 39 rts | |
AF27 C6FF L_AF27 ldb #$ff ; * compute PLAY duration | |
AF29 96E5 lda <$e5 ; duration modifier (no. of dots) | |
AF2B 2705 beq L_AF32 | |
AF2D 8B02 adda #$02 | |
AF2F 3D mul | |
AF30 44 lsra | |
AF31 56 rorb | |
AF32 39 L_AF32 rts | |
AF33 3410 L_AF33 pshs x ; * (called by PLAY & DRAW) | |
AF35 0DD8 L_AF35 tst <$d8 ; remaining string length | |
AF37 274D beq do_fc_error_AF86 | |
AF39 9ED9 ldx <$d9 ; string pointer | |
AF3B A680 lda ,x+ | |
AF3D 9FD9 stx <$d9 ; string pointer | |
AF3F 0AD8 dec <$d8 ; remaining string length | |
AF41 8120 cmpa #$20 | |
AF43 27F0 beq L_AF35 | |
AF45 3590 puls x,pc | |
AF47 8DEA L_AF47 bsr L_AF33 ; get character | |
AF49 812B cmpa #$2b ; inc | |
AF4B 273C beq L_AF89 | |
AF4D 812D cmpa #$2d ; dec | |
AF4F 273C beq L_AF8D | |
AF51 813E cmpa #$3e ; double | |
AF53 2742 beq L_AF97 | |
AF55 813C cmpa #$3c ; halve | |
AF57 2739 beq L_AF92 | |
AF59 813D L_AF59 cmpa #$3d ; equals a variable | |
AF5B 273F beq L_AF9C | |
AF5D BDA438 jsr L_A438 ; carry set if A non-numeric | |
AF60 2524 bcs do_fc_error_AF86 ; ?FC ERROR | |
AF62 5F clrb | |
AF63 8030 L_AF63 suba #$30 | |
AF65 97D7 sta <$d7 | |
AF67 860A lda #$0a | |
AF69 3D mul | |
AF6A 4D tsta | |
AF6B 2619 bne do_fc_error_AF86 ; ?FC ERROR | |
AF6D DBD7 addb <$d7 | |
AF6F 2515 bcs do_fc_error_AF86 ; ?FC ERROR | |
AF71 0DD8 tst <$d8 ; remaining string length | |
AF73 2717 beq L_AF8C | |
AF75 BDAF33 jsr L_AF33 ; get character | |
AF78 BDA438 jsr L_A438 ; carry set if A non-numeric | |
AF7B 24E6 bcc L_AF63 | |
AF7D 0CD8 L_AF7D inc <$d8 ; remaining string length | |
AF7F 9ED9 ldx <$d9 ; string pointer | |
AF81 301F leax -1,x | |
AF83 9FD9 stx <$d9 ; string pointer | |
AF85 39 rts | |
AF86 7E8B8D do_fc_error_AF86 jmp FC_error ; ?FC ERROR | |
AF89 5C L_AF89 incb ; * increment PLAY parameter | |
AF8A 27FA beq do_fc_error_AF86 ; ?FC ERROR | |
AF8C 39 L_AF8C rts | |
AF8D 5D L_AF8D tstb ; * decrement PLAY parameter | |
AF8E 27F6 beq do_fc_error_AF86 ; ?FC ERROR | |
AF90 5A decb | |
AF91 39 rts | |
AF92 5D L_AF92 tstb ; * halve PLAY parameter | |
AF93 27F1 beq do_fc_error_AF86 ; ?FC ERROR | |
AF95 54 lsrb | |
AF96 39 rts | |
AF97 5D L_AF97 tstb ; * double PLAY parameter | |
AF98 2BEC bmi do_fc_error_AF86 ; ?FC ERROR | |
AF9A 58 lslb | |
AF9B 39 rts | |
AF9C 3460 L_AF9C pshs y,u ; * PLAY parameter equals a variable | |
AF9E 8D16 bsr L_AFB6 ; validate variable | |
AFA0 BD8E54 jsr L_8E54 ; get number in B from FPA1 | |
AFA3 35E0 puls y,u,pc | |
AFA5 BDAFB6 L_AFA5 jsr L_AFB6 ; validate variable | |
AFA8 C602 ldb #$02 | |
AFAA BD8331 jsr L_8331 ; memory check | |
AFAD D6D8 ldb <$d8 ; remaining string length | |
AFAF 9ED9 ldx <$d9 ; string pointer | |
AFB1 3414 pshs b,x | |
AFB3 7EADCD jmp L_ADCD | |
AFB6 9ED9 L_AFB6 ldx <$d9 ; string pointer | |
AFB8 3410 pshs x | |
AFBA BDAF33 jsr L_AF33 ; get character | |
AFBD BD8ADF jsr L_8ADF ; carry clear if A-Z | |
AFC0 25C4 bcs do_fc_error_AF86 ; ?FC ERROR | |
AFC2 BDAF33 L_AFC2 jsr L_AF33 ; get character | |
AFC5 813B cmpa #$3b | |
AFC7 26F9 bne L_AFC2 | |
AFC9 3510 puls x | |
AFCB DEA6 ldu <$a6 ; BASIC source pointer | |
AFCD 3440 pshs u | |
AFCF 9FA6 stx <$a6 ; BASIC source pointer | |
AFD1 BD89C1 jsr L_89C1 | |
AFD4 3510 puls x | |
AFD6 9FA6 stx <$a6 ; BASIC source pointer | |
AFD8 39 rts | |
AFD9 4F L_AFD9 clra ; * IRQ service routine continued | |
AFDA 1F8B tfr a,dp | |
AFDC DCE3 ldd <$e3 ; PLAY duration counter | |
AFDE 10270B20 lbeq L_BB02 | |
AFE2 93D5 subd <$d5 ; must be in PLAY loop | |
AFE4 DDE3 std <$e3 ; therefore calculate | |
AFE6 220D bhi L_AFF5 ; duration remaining | |
AFE8 0FE3 clr <$e3 ; PLAY duration counter | |
AFEA 0FE4 clr <$e4 | |
AFEC 3502 puls a | |
AFEE 10EE67 lds 7,s ; points S to old U (=$adf5) | |
AFF1 847F anda #$7f ; mask entire state save | |
AFF3 3402 pshs a ; RTI will now return to $adf5 | |
AFF5 3B L_AFF5 rti | |
AFF6 0A0C0103050608 data_AFF6 fcb $0a,$0c,$01,$03,$05,$06,$08 ; * PLAY letter to note number XLAT table | |
AFFD 01A80190017A01640150013D012B011A data_AFFD fcb $01,$a8,$01,$90,$01,$7a,$01,$64,$01,$50,$01,$3d,$01,$2b,$01,$1a ; * PLAY pitch XLAT table for octaves 1 & 2 | |
B00D 010A00FB00ED00DF fcb $01,$0a,$00,$fb,$00,$ed,$00,$df | |
B015 00D300C700BB00B100A6009D0094008B data_B015 fcb $00,$d3,$00,$c7,$00,$bb,$00,$b1,$00,$a6,$00,$9d,$00,$94,$00,$8b | |
B025 0083007C0075006EA69C938B837B746D fcb $00,$83,$00,$7c,$00,$75,$00,$6e,$a6,$9c,$93,$8b,$83,$7b,$74,$6d | |
B035 67615B56514C47433F3B3734312E2B28 fcb $67,$61,$5b,$56,$51,$4c,$47,$43,$3f,$3b,$37,$34,$31,$2e,$2b,$28 | |
B045 2623211F1D1B191816141312 fcb $26,$23,$21,$1f,$1d,$1b,$19,$18,$16,$14,$13,$12 | |
B051 9E8A DRAW_dispatch ldx <$8a ; zero | |
B053 C601 ldb #$01 | |
B055 3414 pshs b,x | |
B057 D7C2 stb <$c2 ; PRESET / PSET flag | |
B059 9FD5 stx <$d5 | |
B05B BDA928 jsr L_A928 ; set up colours | |
B05E BD8887 jsr get_string ; get expression | |
B061 BD8D9A L_B061 jsr L_8D9A ; validate string & point X to it (len in B) | |
B064 2008 bra L_B06E | |
B066 BDAF33 L_B066 jsr L_AF33 ; get character | |
B069 7EAF59 jmp L_AF59 ; check for number or =variable (get into B) | |
B06C 3514 L_B06C puls b,x | |
B06E D7D8 L_B06E stb <$d8 ; remaining string length | |
B070 27FA beq L_B06C | |
B072 9FD9 stx <$d9 ; string pointer | |
B074 102700EA lbeq L_B162 ; nothing left to do - RTS | |
B078 0DD8 L_B078 tst <$d8 ; remaining string length | |
B07A 27F0 beq L_B06C | |
B07C BDAF33 jsr L_AF33 ; get character | |
B07F 813B cmpa #$3b | |
B081 27F5 beq L_B078 | |
B083 8127 cmpa #$27 | |
B085 27F1 beq L_B078 | |
B087 814E cmpa #$4e | |
B089 2604 bne L_B08F | |
B08B 03D5 com <$d5 | |
B08D 20E9 bra L_B078 | |
B08F 8142 L_B08F cmpa #$42 | |
B091 2604 bne L_B097 | |
B093 03D6 com <$d6 | |
B095 20E1 bra L_B078 | |
B097 8158 L_B097 cmpa #$58 | |
B099 10270096 lbeq L_B133 | |
B09D 814D cmpa #$4d | |
B09F 1027012A lbeq L_B1CD | |
B0A3 3402 pshs a | |
B0A5 C601 ldb #$01 | |
B0A7 0DD8 tst <$d8 ; remaining string length | |
B0A9 2711 beq L_B0BC | |
B0AB BDAF33 jsr L_AF33 ; get character | |
B0AE BD8ADF jsr L_8ADF ; carry clear if A-Z | |
B0B1 3401 pshs cc | |
B0B3 BDAF7D jsr L_AF7D ; move string pointer back one | |
B0B6 3501 puls cc | |
B0B8 2402 bcc L_B0BC | |
B0BA 8DAA bsr L_B066 ; check for number or =variable (get into B) | |
B0BC 3502 L_B0BC puls a | |
B0BE 8143 cmpa #$43 | |
B0C0 2728 beq L_B0EA | |
B0C2 8141 cmpa #$41 | |
B0C4 272E beq L_B0F4 | |
B0C6 8153 cmpa #$53 | |
B0C8 2732 beq L_B0FC | |
B0CA 8155 cmpa #$55 | |
B0CC 275C beq L_B12A | |
B0CE 8144 cmpa #$44 | |
B0D0 2755 beq L_B127 | |
B0D2 814C cmpa #$4c | |
B0D4 274C beq L_B122 | |
B0D6 8152 cmpa #$52 | |
B0D8 2743 beq L_B11D | |
B0DA 8045 suba #$45 | |
B0DC 272F beq L_B10D | |
B0DE 4A deca | |
B0DF 2727 beq L_B108 | |
B0E1 4A deca | |
B0E2 2732 beq L_B116 | |
B0E4 4A deca | |
B0E5 271D beq L_B104 | |
B0E7 7E8B8D do_fc_error_B0E7 jmp FC_error ; ?FC ERROR | |
B0EA BDA8EB L_B0EA jsr L_A8EB ; interpret colour in B | |
B0ED D7B2 stb <$b2 ; foreground colour | |
B0EF BDA928 jsr L_A928 ; set up colours | |
B0F2 2084 L_B0F2 bra L_B078 | |
B0F4 C104 L_B0F4 cmpb #$04 ; * DRAW 'A' | |
B0F6 24EF bcc do_fc_error_B0E7 ; ?FC ERROR | |
B0F8 D7E8 stb <$e8 ; angle | |
B0FA 20F6 bra L_B0F2 | |
B0FC C13F L_B0FC cmpb #$3f ; * DRAW 'S' | |
B0FE 24E7 bcc do_fc_error_B0E7 ; ?FC ERROR | |
B100 D7E9 stb <$e9 ; scale | |
B102 20EE bra L_B0F2 | |
B104 4F L_B104 clra ; * DRAW 'H' (D = X = -B) | |
B105 8D58 bsr L_B15F ; NEGB, A=A-C | |
B107 21 fcb $21 ; brn L_B158 - comment byte | |
B108 4F L_B108 clra ; usually skipped by comment byte | |
B109 1F01 tfr d,x ; * (B108 4F CLRA) | |
B10B 2059 bra L_B166 | |
B10D 4F L_B10D clra ; * DRAW 'E' (D = B, X = -B) | |
B10E 1F01 tfr d,x | |
B110 8D4D bsr L_B15F ; NEGB, A=A-C | |
B112 1E01 exg d,x | |
B114 2050 bra L_B166 | |
B116 4F L_B116 clra ; * DRAW 'G' (D = -B, X = B) | |
B117 1F01 tfr d,x | |
B119 8D44 bsr L_B15F ; NEGB, A=A-C | |
B11B 2049 bra L_B166 | |
B11D 4F L_B11D clra ; * DRAW 'R' (D = B, X = 0) | |
B11E 9E8A L_B11E ldx <$8a ; zero | |
B120 2044 bra L_B166 | |
B122 4F L_B122 clra ; * DRAW 'L' (D = -B, X = 0) | |
B123 8D3A bsr L_B15F ; NEGB, A=A-C | |
B125 20F7 bra L_B11E | |
B127 4F L_B127 clra ; * DRAW 'D' (D = 0, X = B) | |
B128 2003 bra L_B12D | |
B12A 4F L_B12A clra ; * DRAW 'U' (D = 0, X = -B) | |
B12B 8D32 bsr L_B15F ; NEGB, A=A-C | |
B12D 9E8A L_B12D ldx <$8a ; zero | |
B12F 1E10 exg x,d | |
B131 2033 bra L_B166 | |
B133 BDAFB6 L_B133 jsr L_AFB6 ; validate variable | |
B136 C602 ldb #$02 | |
B138 BD8331 jsr L_8331 ; memory check | |
B13B D6D8 ldb <$d8 ; remaining string length | |
B13D 9ED9 ldx <$d9 ; string pointer | |
B13F 3414 pshs b,x ; store current string | |
B141 7EB061 jmp L_B061 ; start again with new string | |
B144 D6E9 L_B144 ldb <$e9 ; * apply DRAW scale factor to X | |
B146 271B beq L_B163 | |
B148 4F clra | |
B149 1E01 exg d,x | |
B14B A7E2 sta ,-s | |
B14D 2A02 bpl L_B151 | |
B14F 8D0D bsr L_B15E ; D = -D | |
B151 BDB350 L_B151 jsr L_B350 ; Y:U = D * X | |
B154 1F30 tfr u,d | |
B156 44 lsra | |
B157 56 rorb | |
B158 44 L_B158 lsra | |
B159 56 rorb | |
B15A 6DE0 tst ,s+ | |
B15C 2A04 bpl L_B162 | |
B15E 40 L_B15E nega | |
B15F 50 L_B15F negb | |
B160 8200 sbca #$00 | |
B162 39 L_B162 rts | |
B163 1F10 L_B163 tfr x,d | |
B165 39 rts | |
B166 3406 L_B166 pshs a,b ; * (D = horizontal component, X = vertical component) | |
B168 8DDA bsr L_B144 ; scale X into D | |
B16A 3510 puls x | |
B16C 3406 pshs a,b | |
B16E 8DD4 bsr L_B144 ; scale X into D | |
B170 3510 puls x | |
B172 109EE8 ldy <$e8 ; angle | |
B175 3420 pshs y | |
B177 6DE4 L_B177 tst ,s | |
B179 2708 beq L_B183 | |
B17B 1E10 exg x,d ; swap vector components | |
B17D 8DDF bsr L_B15E ; D = -D | |
B17F 6AE4 dec ,s | |
B181 20F4 bra L_B177 ; rotate another 90 degrees | |
B183 3520 L_B183 puls y | |
B185 DE8A ldu <$8a ; zero | |
B187 D3C7 addd <$c7 ; current X | |
B189 2B02 bmi L_B18D | |
B18B 1F03 tfr d,u ; U = new X | |
B18D 1F10 L_B18D tfr x,d | |
B18F 9E8A ldx <$8a ; zero | |
B191 D3C9 addd <$c9 ; current Y | |
B193 2B02 bmi L_B197 | |
B195 1F01 tfr d,x | |
B197 11830100 L_B197 cmpu #$0100 | |
B19B 2503 bcs L_B1A0 | |
B19D CE00FF ldu #$00ff | |
B1A0 8C00C0 L_B1A0 cmpx #$00c0 | |
B1A3 2503 bcs L_B1A8 | |
B1A5 8E00BF ldx #$00bf ; X = new Y | |
B1A8 DCC7 L_B1A8 ldd <$c7 | |
B1AA DDBD std <$bd | |
B1AC DCC9 ldd <$c9 | |
B1AE DDBF std <$bf | |
B1B0 9FC5 stx <$c5 | |
B1B2 DFC3 stu <$c3 | |
B1B4 0DD5 tst <$d5 | |
B1B6 2604 bne L_B1BC ; no position update | |
B1B8 9FC9 stx <$c9 | |
B1BA DFC7 stu <$c7 | |
B1BC BDA7AE L_B1BC jsr L_A7AE ; adjust coords for PMODE | |
B1BF 0DD6 tst <$d6 | |
B1C1 2603 bne L_B1C6 ; blank move | |
B1C3 BDA82F jsr L_A82F ; draw line | |
B1C6 0FD5 L_B1C6 clr <$d5 | |
B1C8 0FD6 clr <$d6 | |
B1CA 7EB078 jmp L_B078 | |
B1CD BDAF33 L_B1CD jsr L_AF33 ; get character | |
B1D0 3402 pshs a | |
B1D2 BDB1F9 jsr L_B1F9 ; get ordinate into D | |
B1D5 3406 pshs a,b | |
B1D7 BDAF33 jsr L_AF33 ; get character | |
B1DA 812C cmpa #$2c | |
B1DC 1026FF07 lbne do_fc_error_B0E7 | |
B1E0 BDB1F6 jsr L_B1F6 ; get ordinate into D | |
B1E3 1F01 tfr d,x | |
B1E5 3540 puls u | |
B1E7 3502 puls a | |
B1E9 812B cmpa #$2b | |
B1EB 2704 beq L_B1F1 | |
B1ED 812D cmpa #$2d | |
B1EF 26A6 bne L_B197 ; absolute position | |
B1F1 1F30 L_B1F1 tfr u,d | |
B1F3 7EB166 jmp L_B166 ; relative movement | |
B1F6 BDAF33 L_B1F6 jsr L_AF33 ; get character | |
B1F9 812B L_B1F9 cmpa #$2b | |
B1FB 2707 beq L_B204 | |
B1FD 812D cmpa #$2d | |
B1FF 2704 beq L_B205 | |
B201 BDAF7D jsr L_AF7D ; move string pointer back one | |
B204 4F L_B204 clra | |
B205 3402 L_B205 pshs a | |
B207 BDB066 jsr L_B066 ; check for number or =variable (get into B) | |
B20A 3502 puls a | |
B20C 4D tsta | |
B20D 2704 beq L_B213 | |
B20F 4F clra | |
B210 50 negb | |
B211 8200 sbca #$00 | |
B213 39 L_B213 rts | |
B214 00000001FEC51919FB1631F2F4FB4A51 data_B214 fcb $00,$00,$00,$01,$fe,$c5,$19,$19,$fb,$16,$31,$f2,$f4,$fb,$4a,$51 ; * circle is drawn in 8 main sectors with 8 or 9 subdivisions each | |
B224 EC8461F9E1C778AED4DC8E3BC5E5A269 fcb $ec,$84,$61,$f9,$e1,$c7,$78,$ae,$d4,$dc,$8e,$3b,$c5,$e5,$a2,$69 | |
B234 B506B506 fcb $b5,$06,$b5,$06 | |
B238 8140 CIRCLE_dispatch cmpa #$40 ; * CIRCLE | |
B23A 2602 bne L_B23E ; optional @ before coords | |
B23C 9D9F jsr <$9f ; get next character from BASIC source | |
B23E BDA8B0 L_B23E jsr L_A8B0 ; set up max coords for PMODE | |
B241 BDA740 jsr L_A740 ; get coords from command into $bd / $bf | |
B244 BDA6AB jsr L_A6AB ; adjust coords for PMODE | |
B247 AEC4 ldx ,u | |
B249 9FCB stx <$cb | |
B24B AE42 ldx 2,u | |
B24D 9FCD stx <$cd | |
B24F BD89AA jsr CkComa ; check comma | |
B252 BD8E83 jsr Get16Bit ; get 16 bit number into X | |
B255 CE00CF ldu #$00cf | |
B258 AFC4 stx ,u ; circle radius | |
B25A BDA6AE jsr L_A6AE ; adjust radius correct for PMODE | |
B25D 8601 lda #$01 | |
B25F 97C2 sta <$c2 ; PRESET / PSET flag | |
B261 BDA90F jsr L_A90F ; read optional colour | |
B264 8E0100 ldx #$0100 | |
B267 9DA5 jsr <$a5 ; get current character from BASIC source | |
B269 270F beq L_B27A | |
B26B BD89AA jsr CkComa ; check comma | |
B26E BD8872 jsr L_8872 ; get FP number (h/w ratio) | |
B271 964F lda <$4f | |
B273 8B08 adda #$08 | |
B275 974F sta <$4f ; multiply FP number by 256 | |
B277 BD8E86 jsr L_8E86 ; read 16 bit number into X from FPA1 | |
B27A 96B6 L_B27A lda <$b6 ; current PMODE | |
B27C 8502 bita #$02 | |
B27E 2704 beq L_B284 | |
B280 1F10 tfr x,d | |
B282 308B leax d,x ; double hw ratio for PMODEs 2 & 3 | |
B284 9FD1 L_B284 stx <$d1 | |
B286 C601 ldb #$01 | |
B288 D7C2 stb <$c2 ; PRESET / PSET flag | |
B28A D7D8 stb <$d8 | |
B28C BDB37D jsr L_B37D ; read optional start value | |
B28F 3406 pshs a,b | |
B291 BDB37D jsr L_B37D ; read optional end value | |
B294 DDD9 std <$d9 | |
B296 3506 puls a,b | |
B298 3406 L_B298 pshs a,b ; loop starts here | |
B29A 9EC3 ldx <$c3 ; move old end coords to start coords | |
B29C 9FBD stx <$bd | |
B29E 9EC5 ldx <$c5 | |
B2A0 9FBF stx <$bf | |
B2A2 CEB216 ldu #data_B214 + 2 | |
B2A5 8401 anda #$01 | |
B2A7 2703 beq L_B2AC | |
B2A9 50 negb | |
B2AA CB08 addb #$08 ; B = 8-B for odd sectors | |
B2AC 58 L_B2AC lslb | |
B2AD 58 lslb | |
B2AE 33C5 leau b,u | |
B2B0 3440 pshs u | |
B2B2 BDB342 jsr L_B342 ; X= (,U) x radius | |
B2B5 3540 puls u | |
B2B7 335E leau -2,u | |
B2B9 3410 pshs x | |
B2BB BDB342 jsr L_B342 ; X= (,U) x radius | |
B2BE 3520 puls y ; X & Y now hold circle coord offsets | |
B2C0 A6E4 lda ,s | |
B2C2 8403 anda #$03 | |
B2C4 2706 beq L_B2CC | |
B2C6 8103 cmpa #$03 | |
B2C8 2702 beq L_B2CC | |
B2CA 1E12 exg x,y ; swap X & Y for sectors 1,2,5,6 | |
B2CC 9FC3 L_B2CC stx <$c3 ; x offset | |
B2CE 1F21 tfr y,x | |
B2D0 DCD1 ldd <$d1 | |
B2D2 BDB350 jsr L_B350 ; Y:U = D * X | |
B2D5 1F20 tfr y,d ; D = hw ratio x y ord | |
B2D7 4D tsta | |
B2D8 1026D8B1 lbne FC_error ; ?FC ERROR | |
B2DC D7C5 stb <$c5 ; MSB of y offset | |
B2DE 1F30 tfr u,d | |
B2E0 97C6 sta <$c6 ; LSB of y offset | |
B2E2 A6E4 lda ,s | |
B2E4 8102 cmpa #$02 | |
B2E6 250E bcs L_B2F6 | |
B2E8 8106 cmpa #$06 | |
B2EA 240A bcc L_B2F6 | |
B2EC DCCB ldd <$cb | |
B2EE 93C3 subd <$c3 ; x = centre - offset | |
B2F0 2411 bcc L_B303 ; for sectors 2,3,4,5 | |
B2F2 4F clra ; keep on screen | |
B2F3 5F clrb | |
B2F4 200D bra L_B303 | |
B2F6 DCCB L_B2F6 ldd <$cb | |
B2F8 D3C3 addd <$c3 ; x = centre + offset | |
B2FA 2505 bcs L_B301 ; for sectors 0,1,6,7 | |
B2FC 1093D3 cmpd <$d3 ; keep on screen | |
B2FF 2502 bcs L_B303 | |
B301 DCD3 L_B301 ldd <$d3 | |
B303 DDC3 L_B303 std <$c3 ; circle x ord now calculated | |
B305 A6E4 lda ,s | |
B307 8104 cmpa #$04 | |
B309 250A bcs L_B315 | |
B30B DCCD ldd <$cd | |
B30D 93C5 subd <$c5 ; y = centre - offset | |
B30F 2411 bcc L_B322 ; for sectors 4,5,6,7 | |
B311 4F clra ; keep on screen | |
B312 5F clrb | |
B313 200D bra L_B322 | |
B315 DCCD L_B315 ldd <$cd | |
B317 D3C5 addd <$c5 ; y = centre + offset | |
B319 2505 bcs L_B320 ; for sectors 0,1,2,3 | |
B31B 1093D5 cmpd <$d5 ; keep on screen | |
B31E 2502 bcs L_B322 | |
B320 DCD5 L_B320 ldd <$d5 | |
B322 DDC5 L_B322 std <$c5 ; circle y ord now calculated | |
B324 0DD8 tst <$d8 | |
B326 2602 bne L_B32A ; 1st loop - don't draw | |
B328 8D50 bsr L_B37A ; draw line ($bd,$bf)-($c3,$c5) | |
B32A 3506 L_B32A puls a,b | |
B32C 04D8 lsr <$d8 | |
B32E 2505 bcs L_B335 ; 1st loop - don't test end condition | |
B330 1093D9 cmpd <$d9 ; reached end angle? | |
B333 270C beq L_B341 | |
B335 5C L_B335 incb ; increment angle counter | |
B336 C108 cmpb #$08 | |
B338 2604 bne L_B33E | |
B33A 4C inca | |
B33B 5F clrb | |
B33C 8407 anda #$07 | |
B33E 7EB298 L_B33E jmp L_B298 | |
B341 39 L_B341 rts | |
B342 9ECF L_B342 ldx <$cf ; radius | |
B344 ECC4 ldd ,u | |
B346 2707 beq L_B34F | |
B348 830001 subd #$0001 | |
B34B 8D03 bsr L_B350 ; Y:U = D * X | |
B34D 1F21 tfr y,x | |
B34F 39 L_B34F rts | |
B350 3476 L_B350 pshs a,b,x,y,u ; * multiplies D by X & leaves result in Y:U | |
B352 6F64 clr 4,s | |
B354 A663 lda 3,s | |
B356 3D mul | |
B357 ED66 std 6,s | |
B359 EC61 ldd 1,s | |
B35B 3D mul | |
B35C EB66 addb 6,s | |
B35E 8900 adca #$00 | |
B360 ED65 std 5,s | |
B362 E6E4 ldb ,s | |
B364 A663 lda 3,s | |
B366 3D mul | |
B367 E365 addd 5,s | |
B369 ED65 std 5,s | |
B36B 2402 bcc L_B36F | |
B36D 6C64 inc 4,s | |
B36F A6E4 L_B36F lda ,s | |
B371 E662 ldb 2,s | |
B373 3D mul | |
B374 E364 addd 4,s | |
B376 ED64 std 4,s | |
B378 35F6 puls a,b,x,y,u,pc | |
B37A 7EA82F L_B37A jmp L_A82F ; draw line | |
B37D 5F L_B37D clrb ; * & bottom 3 bits in B | |
B37E 9DA5 jsr <$a5 ; get current character from BASIC source | |
B380 2711 beq L_B393 | |
B382 BD89AA jsr CkComa ; check comma | |
B385 BD8872 jsr L_8872 ; get FP number | |
B388 964F lda <$4f | |
B38A 8B06 adda #$06 | |
B38C 974F sta <$4f ; multiply FP number by 64 | |
B38E BD8E54 jsr L_8E54 ; get FP number in B | |
B391 C43F andb #$3f | |
B393 1F98 L_B393 tfr b,a | |
B395 C407 andb #$07 | |
B397 44 lsra | |
B398 44 lsra | |
B399 44 lsra | |
B39A 39 rts | |
B39B 10CE03D7 continue_reset lds #$03d7 ; * reset routine continued | |
B39F 8637 lda #$37 ; enable cart FIRQ | |
B3A1 B7FF23 sta >$ff23 | |
B3A4 9671 lda <$71 ; cold boot flag | |
B3A6 8155 cmpa #$55 | |
B3A8 2610 bne cold_start ; cold boot | |
B3AA 9E72 ldx <$72 ; soft reset vector | |
B3AC A684 lda ,x | |
B3AE 8112 cmpa #$12 | |
B3B0 2608 bne cold_start ; cold boot | |
B3B2 6E84 jmp ,x ; soft reset | |
B3B4 318CE4 RESET_service leay <continue_reset,pcr ; * reset routine (CPU vector) | |
B3B7 7E8000 jmp call_HWINIT ; JMP to $BB3C | |
B3BA 8E0401 cold_start ldx #$0401 ; clear 0 - 3ff | |
B3BD 6F83 L_B3BD clr ,--x | |
B3BF 3001 leax 1,x | |
B3C1 26FA bne L_B3BD | |
B3C3 BDBA77 jsr clear_screen ; clear text screen | |
B3C6 6F80 clr ,x+ | |
B3C8 9F19 stx <$19 ; start of BASIC program | |
B3CA A602 L_B3CA lda 2,x ; memory test | |
B3CC 43 coma | |
B3CD A702 sta 2,x | |
B3CF A102 cmpa 2,x | |
B3D1 2606 bne L_B3D9 | |
B3D3 3001 leax 1,x | |
B3D5 6301 com 1,x | |
B3D7 20F1 bra L_B3CA | |
B3D9 9F74 L_B3D9 stx <$74 ; top of RAM | |
B3DB 9F27 stx <$27 ; top of BASIC RAM | |
B3DD 9F23 stx <$23 ; top of free string space | |
B3DF 3089FF38 leax >$ff38,x | |
B3E3 9F21 stx <$21 ; stack root / string storage start | |
B3E5 1F14 tfr x,s | |
B3E7 BD8003 jsr call_SWINIT ; calls $BB88 | |
B3EA 8EB487 ldx #copy_to_009D | |
B3ED CE009D ldu #$009d ; initialise system variables | |
B3F0 C60E ldb #$0e | |
B3F2 BDB7CC jsr L_B7CC ; copy B bytes from X to U | |
B3F5 CE010C ldu #$010c ; initialise system variables | |
B3F8 C61E ldb #$1e | |
B3FA BDB7CC jsr L_B7CC ; copy B bytes from X to U | |
B3FD 8E89B4 ldx #SN_error ; ?SN ERROR | |
B400 AF43 stx 3,u ; dummy disk command jump | |
B402 AF48 stx 8,u ; dummy disk function jump | |
B404 8E015E ldx #$015e ; set patch vectors to RTS | |
B407 CC394B ldd #$394b | |
B40A A780 L_B40A sta ,x+ | |
B40C 5A decb | |
B40D 26FB bne L_B40A | |
B40F B702D9 sta >$02d9 ; mystery RTS | |
B412 BD8417 jsr erase_basic ; NEW BASIC | |
B415 BD98E3 jsr L_98E3 ; set up PLAY & graphics variables | |
B418 8E0134 ldx #$0134 ; set up USR vectors | |
B41B 9FB0 stx <$b0 ; address of USR table | |
B41D CE8B8D ldu #FC_error ; ?FC ERROR | |
B420 C60A ldb #$0a | |
B422 EF81 L_B422 stu ,x++ | |
B424 5A decb | |
B425 26FB bne L_B422 | |
B427 BDAA81 jsr L_AA81 ; PCLEAR 4 | |
B42A B6FF03 lda >$ff03 | |
B42D 8A01 ora #$01 | |
B42F B7FF03 sta >$ff03 ; enable vsync irq | |
B432 8E444B ldx #$444b ; check for 'DK' disk | |
B435 BCC000 cmpx >$c000 ; cartridge sigature | |
B438 10270BC6 lbeq L_C002 | |
B43C 1CAF andcc #$af ; enable interrupts | |
B43E 8EB4B2 ldx #copyright - 1 | |
B441 BD90E5 jsr out_string ; display copyright message | |
B444 8EB44F ldx #warm_start ; set up soft reset vector | |
B447 9F72 stx <$72 ; soft reset vector | |
B449 8655 lda #$55 | |
B44B 9771 sta <$71 ; cold boot flag | |
B44D 2017 bra L_B466 ; (JMP $8371 - command mode) | |
B44F 12 warm_start nop ; * normal soft reset routine | |
B450 0FE3 clr <$e3 ; clear PLAY duration counter | |
B452 0FE4 clr <$e4 | |
B454 B6FF03 lda >$ff03 ; enable vsync irq | |
B457 8A01 ora #$01 | |
B459 B7FF03 sta >$ff03 | |
B45C 0F6F clr <$6f ; DEVN = VDU | |
B45E BD8434 jsr reset_stack ; reset stack | |
B461 1CAF andcc #$af ; enable interrupts | |
B463 BDBA77 jsr clear_screen ; clear screen | |
B466 7E8371 L_B466 jmp goto_ok_prompt ; command mode | |
B469 7DFF23 FIRQ_service tst >$ff23 ; * FIRQ service routine | |
B46C 2B01 bmi L_B46F ; cartridge | |
B46E 3B rti | |
B46F BDB480 L_B46F jsr L_B480 ; delay | |
B472 BDB480 jsr L_B480 | |
B475 318C03 leay <start_cartridge,pcr | |
B478 7E8000 jmp call_HWINIT | |
B47B 0F71 start_cartridge clr <$71 ; cold boot flag | |
B47D 7EC000 jmp >$c000 | |
B480 9E8A L_B480 ldx <$8a ; zero | |
B482 301F L_B482 leax -1,x | |
B484 26FC bne L_B482 | |
B486 39 rts | |
B487 BF49 copy_to_009D fdb BOOT64K ; * (default EXEC & get character routine) / EXEC default entry | |
B489 0CA7 inc <$a7 ; CHRGET | |
B48B 2602 bne L_B48F | |
B48D 0CA6 inc <$a6 | |
B48F B60000 L_B48F lda >$0000 | |
B492 7EBB26 jmp chrget_next | |
B495 7E9D3D copy_to_010C jmp IRQ_service ; * (IRQ, FIRQ, RND seeds, key delay, command addresses) | |
B498 7EB469 jmp FIRQ_service | |
B49B 000000 fcb $00,$00,$00 | |
B49E 804FC75259 fcb $80,$4f,$c7,$52,$59 ; random number seed | |
B4A3 00 fcb $00 ; FLAG64 | |
B4A4 0000 fcb $00,$00 ; CSUM64 | |
B4A6 00 fcb $00 ; LSTKEY | |
B4A7 00 fcb $00 ; CNTDWN | |
B4A8 05 fcb $05 ; REPDLY | |
B4A9 4E fcb $4e ; STUB0 - number of words | |
B4AA 80338154 fdb reserved_words,reserved_dispatch | |
B4AE 22 fcb $22 ; STUB0 - number of functions | |
B4AF 81CA8250 fdb function_words,function_dispatch | |
B4B3 284329203139383220445241474F4E2044415441204C5444200D copyright fcc /(C) 1982 DRAGON DATA LTD /,$0d ; * copyright message | |
B4CD 31364B20424153494320494E54455250524554455220312E302020202020200D fcc /16K BASIC INTERPRETER 1.0 /,$0d | |
B4ED 2843292031393832204259204D4943524F534F46540D copyright_ms fcc /(C) 1982 BY MICROSOFT/,$0d | |
B503 0D00 fcc $0d,$00 | |
B505 8D03 L_B505 bsr L_B50A ; * read 7 bit character from device DEVN | |
B507 847F anda #$7f | |
B509 39 rts | |
B50A BD016A L_B50A jsr >$016a ; PATCH - input character from DEVN | |
B50D 0F70 clr <$70 ; EOF flag | |
B50F 0D6F tst <$6f ; DEVN | |
B511 2725 beq L_B538 ; get character from keyboard | |
B513 0D79 tst <$79 ; no. of characters in buffer | |
B515 2603 bne L_B51A ; get character from file | |
B517 0370 com <$70 ; set EOF flag | |
B519 39 rts | |
B51A 3474 L_B51A pshs b,x,y,u ; * read character from file | |
B51C 9E7A ldx <$7a ; buffer pointer | |
B51E A680 lda ,x+ | |
B520 3402 pshs a | |
B522 9F7A stx <$7a ; buffer pointer | |
B524 0A79 dec <$79 ; no. of characters in buffer | |
B526 2609 bne L_B531 | |
B528 966F lda <$6f ; DEVN | |
B52A 81FD cmpa #$fd | |
B52C 2705 beq L_B533 ; serial | |
B52E BDB867 jsr L_B867 ; get block from tape | |
B531 35F6 L_B531 puls a,b,x,y,u,pc | |
B533 BDA106 L_B533 jsr L_A106 ; get block from serial | |
B536 20F9 bra L_B531 | |
B538 3414 L_B538 pshs b,x ; * (with cursor) | |
B53A BD8009 L_B53A jsr call_CBLINK ; blink cursor | |
B53D BD8006 jsr POLCAT ; scan keyboard | |
B540 27F8 beq L_B53A | |
B542 C660 ldb #$60 | |
B544 E79F0088 stb [$0088] ; text cursor address | |
B548 3594 puls b,x,pc | |
B54A BD0167 OUTCHR jsr >$0167 ; PATCH - output character to DEVN | |
B54D 3404 pshs b | |
B54F D66F ldb <$6f ; DEVN | |
B551 C1FD cmpb #$fd | |
B553 2602 bne L_B557 ; not -3 (serial output not supported) | |
B555 3584 puls b,pc | |
B557 5C L_B557 incb | |
B558 3504 puls b | |
B55A 102BCAB1 lbmi call_LPOUT ; send to printer | |
B55E 262F bne L_B58F ; send to VDU | |
B560 3416 pshs a,b,x ; send to file | |
B562 D678 ldb <$78 ; cassette IO status | |
B564 5A decb | |
B565 270F beq L_B576 ; input - quit | |
B567 D679 ldb <$79 ; no. of characters in buffer | |
B569 5C incb | |
B56A 2602 bne L_B56E | |
B56C 8D0A bsr L_B578 ; flush tape buffer | |
B56E 9E7A L_B56E ldx <$7a ; buffer pointer | |
B570 A780 sta ,x+ | |
B572 9F7A stx <$7a ; buffer pointer | |
B574 0C79 inc <$79 ; no. of characters in buffer | |
B576 3596 L_B576 puls a,b,x,pc | |
B578 C601 L_B578 ldb #$01 ; * flush tape buffer | |
B57A D77C L_B57A stb <$7c ; block type | |
B57C 8E01DA ldx #$01da ; IO buffer | |
B57F 9F7E stx <$7e | |
B581 D679 ldb <$79 ; no. of characters in buffer | |
B583 D77D stb <$7d ; block length | |
B585 3462 pshs a,y,u | |
B587 BDB991 jsr L_B991 ; write leader & block to tape | |
B58A 3562 puls a,y,u | |
B58C 7EB882 jmp L_B882 ; reset IO buffer | |
B58F BDA93A L_B58F jsr reset_vdu ; reset VDU | |
B592 7E800C jmp CHROUT ; write to VDU | |
B595 BD0164 L_B595 jsr >$0164 ; PATCH - device initialisation | |
B598 3416 pshs a,b,x | |
B59A 0F6E clr <$6e ; cassette IO flag | |
B59C 966F lda <$6f ; DEVN | |
B59E 2709 beq L_B5A9 ; VDU | |
B5A0 4C inca | |
B5A1 2717 beq L_B5BA ; cassette | |
B5A3 9E99 ldx <$99 ; printer comma field width / last comma field | |
B5A5 DC9B ldd <$9b ; printer line width / head pos | |
B5A7 2009 bra L_B5B2 | |
B5A9 D689 L_B5A9 ldb <$89 | |
B5AB C41F andb #$1f ; get VDU column number | |
B5AD 8E1010 ldx #$1010 | |
B5B0 8620 lda #$20 | |
B5B2 9F6A L_B5B2 stx <$6a ; comma field width / last comma field | |
B5B4 D76C stb <$6c ; current column number | |
B5B6 976D sta <$6d ; line width | |
B5B8 3596 puls a,b,x,pc | |
B5BA 036E L_B5BA com <$6e ; set cassette IO flag | |
B5BC 8E0100 ldx #$0100 | |
B5BF 4F clra | |
B5C0 5F clrb | |
B5C1 20EF bra L_B5B2 | |
B5C3 BDBA77 L_B5C3 jsr clear_screen ; clear screen | |
B5C6 BD0182 L_B5C6 jsr >$0182 ; PATCH - line input file | |
B5C9 0F87 clr <$87 ; last key pressed | |
B5CB 8E02DD ldx #$02dd | |
B5CE C601 ldb #$01 ; B = character count | |
B5D0 BDB505 L_B5D0 jsr L_B505 ; read 7 bit character from DEVN | |
B5D3 0D70 tst <$70 ; EOF flag | |
B5D5 262B bne L_B602 ; EOF | |
B5D7 0D6F tst <$6f ; DEVN | |
B5D9 2623 bne L_B5FE ; not keyed input | |
B5DB 810C cmpa #$0c ; CLEAR key | |
B5DD 27E4 beq L_B5C3 | |
B5DF 8108 cmpa #$08 ; backspace | |
B5E1 2607 bne L_B5EA | |
B5E3 5A decb | |
B5E4 27E0 beq L_B5C6 ; nothing to delete | |
B5E6 301F leax -1,x | |
B5E8 2034 bra L_B61E | |
B5EA 8115 L_B5EA cmpa #$15 ; shift + backspace | |
B5EC 260A bne L_B5F8 | |
B5EE 5A L_B5EE decb | |
B5EF 27D5 beq L_B5C6 ; nothing to delete | |
B5F1 8608 lda #$08 | |
B5F3 BDB54A jsr OUTCHR ; output character to DEVN | |
B5F6 20F6 bra L_B5EE | |
B5F8 8103 L_B5F8 cmpa #$03 ; BREAK | |
B5FA 1A01 orcc #$01 | |
B5FC 2705 beq L_B603 | |
B5FE 810D L_B5FE cmpa #$0d ; RETURN | |
B600 260D bne L_B60F | |
B602 4F L_B602 clra | |
B603 3401 L_B603 pshs cc | |
B605 BD90A1 jsr print_CR ; send CR to DEVN | |
B608 6F84 clr ,x | |
B60A 8E02DC ldx #$02dc ; return with carry set if | |
B60D 3581 puls cc,pc ; input aborted with BREAK | |
B60F 8120 L_B60F cmpa #$20 | |
B611 25BD bcs L_B5D0 ; chr < $20 | |
B613 817B cmpa #$7b | |
B615 24B9 bcc L_B5D0 ; chr >= $7b | |
B617 C1FA cmpb #$fa | |
B619 24B5 bcc L_B5D0 ; max no. of characters = $fa | |
B61B A780 sta ,x+ | |
B61D 5C incb | |
B61E BDB54A L_B61E jsr OUTCHR ; echo typed character | |
B621 20AD bra L_B5D0 | |
B623 BD016D L_B623 jsr >$016d ; PATCH - input file | |
B626 966F lda <$6f ; DEVN | |
B628 2721 beq L_B64B ; RTS | |
B62A 4C inca | |
B62B 260C bne do_fm_error_B639 ; ?FM ERROR | |
B62D 9678 lda <$78 ; cassette IO status | |
B62F 2605 bne L_B636 ; open | |
B631 C62E NO_error ldb #$2e ; ?NO ERROR | |
B633 7E8344 jmp system_error | |
B636 4A L_B636 deca | |
B637 2712 beq L_B64B ; input - RTS | |
B639 7EB848 do_fm_error_B639 jmp FM_error ; ?FM ERROR | |
B63C BD0170 L_B63C jsr >$0170 ; PATCH - output file | |
B63F 966F lda <$6f ; DEVN | |
B641 4C inca | |
B642 2607 bne L_B64B ; not cassette | |
B644 9678 lda <$78 ; cassette IO status | |
B646 27E9 beq NO_error ; ?NO ERROR | |
B648 4A deca | |
B649 27EE beq do_fm_error_B639 ; ?FM ERROR | |
B64B 39 L_B64B rts | |
B64C 270E CLOSE_dispatch beq L_B65C ; no parameter so close #-1 | |
B64E BDB7D7 jsr L_B7D7 ; read #-n & set up DEVN (no skip comma) | |
B651 8D10 L_B651 bsr L_B663 ; close DEVN stream & set DEVN to 0 | |
B653 9DA5 jsr <$a5 ; get current character from BASIC source | |
B655 272A beq L_B681 ; RTS | |
B657 BDB7D4 jsr L_B7D4 ; read #-n & set up DEVN | |
B65A 20F5 bra L_B651 ; read next stream no. | |
B65C BD0173 L_B65C jsr >$0173 ; PATCH - close all files | |
B65F 86FF L_B65F lda #$ff ; * close cassette stream & set DEVN to 0 | |
B661 976F sta <$6f ; DEVN | |
B663 BD0176 L_B663 jsr >$0176 ; PATCH - close file | |
B666 966F lda <$6f ; DEVN | |
B668 0F6F clr <$6f ; DEVN | |
B66A 4C inca | |
B66B 2614 bne L_B681 ; not cassette | |
B66D 9678 lda <$78 ; cassette IO status | |
B66F 8102 cmpa #$02 | |
B671 260C bne L_B67F ; not output | |
B673 9679 lda <$79 ; no. of characters in buffer | |
B675 2703 beq L_B67A | |
B677 BDB578 jsr L_B578 ; flush tape buffer | |
B67A C6FF L_B67A ldb #$ff | |
B67C BDB57A jsr L_B57A ; B = $FF = EOF block | |
B67F 0F78 L_B67F clr <$78 ; cassette IO status | |
B681 39 L_B681 rts | |
B682 814D CSAVE_dispatch cmpa #$4d ; * CSAVE | |
B684 1027E278 lbeq L_9900 ; CSAVEM | |
B688 BDB7AA jsr L_B7AA ; get filename | |
B68B 9DA5 jsr <$a5 ; get current character from BASIC source | |
B68D 2716 beq L_B6A5 ; normal CSAVE | |
B68F BD89AA jsr CkComa ; check comma | |
B692 C641 ldb #$41 | |
B694 BD89AC jsr CkChar ; skip over 'A' | |
B697 26E8 bne L_B681 ; return if anything else on command line | |
B699 4F clra ; file type = 0 = tokenized BASIC | |
B69A BDB88E jsr L_B88E ; write filename block for gapped ASCII | |
B69D 86FF lda #$ff | |
B69F 976F sta <$6f ; DEVN = -1 | |
B6A1 4F clra | |
B6A2 7E8EAA jmp LIST_dispatch ; LIST to DEVN - very clever! | |
B6A5 4F L_B6A5 clra ; tokenized BASIC | |
B6A6 9E8A ldx <$8a ; non-ASCII & ungapped | |
B6A8 BDB891 jsr L_B891 ; write filename block | |
B6AB 0F78 clr <$78 ; cassette IO status | |
B6AD 0C7C inc <$7c ; block type | |
B6AF BD801B jsr call_WRTLDR ; write leader | |
B6B2 9E19 ldx <$19 ; start of BASIC program | |
B6B4 9F7E L_B6B4 stx <$7e ; IO buffer | |
B6B6 86FF lda #$ff | |
B6B8 977D sta <$7d ; block length | |
B6BA DC1B ldd <$1b ; start of simple variables | |
B6BC 937E subd <$7e ; IO buffer | |
B6BE 270D beq L_B6CD | |
B6C0 108300FF cmpd #$00ff | |
B6C4 2402 bcc L_B6C8 | |
B6C6 D77D stb <$7d ; block length | |
B6C8 BDB999 L_B6C8 jsr BLKOUT ; write block to tape | |
B6CB 20E7 bra L_B6B4 | |
B6CD 007C L_B6CD neg <$7c ; block type | |
B6CF 0F7D clr <$7d ; block length | |
B6D1 7EB994 jmp L_B994 ; write block & cassette relay off | |
B6D4 0F78 CLOAD_dispatch clr <$78 ; cassette IO status | |
B6D6 814D cmpa #$4d | |
B6D8 1027E9B2 lbeq L_A08E ; CLOADM (returns to $b73c if not gapped) | |
B6DC 3262 leas 2,s | |
B6DE BDB7F7 jsr L_B7F7 ; get filename | |
B6E1 BDB87A jsr L_B87A ; find file & set up buffer | |
B6E4 7D01E4 tst >$01e4 ; gap flag | |
B6E7 271D beq L_B706 | |
B6E9 B601E3 lda >$01e3 ; ASCII flag | |
B6EC 271D beq do_fm_error_B70B ; ?FM ERROR | |
B6EE BD8417 jsr erase_basic ; NEW BASIC | |
B6F1 86FF lda #$ff | |
B6F3 976F sta <$6f ; DEVN = -1 | |
B6F5 0C78 inc <$78 ; cassette status 1 = input | |
B6F7 BDB867 jsr L_B867 ; get block from tape | |
B6FA 7E837A jmp L_837A ; command mode / no device initialise | |
B6FD BD0185 L_B6FD jsr >$0185 ; PATCH - close ASCII file | |
B700 BDB663 jsr L_B663 ; close DEVN stream & set DEVN to 0 | |
B703 7E8371 jmp goto_ok_prompt ; command mode | |
B706 B601E2 L_B706 lda >$01e2 ; file type 0 = tokenized BASIC | |
B709 2703 beq L_B70E | |
B70B 7EB848 do_fm_error_B70B jmp FM_error ; ?FM ERROR | |
B70E BD8417 L_B70E jsr erase_basic ; NEW BASIC | |
B711 BD8021 jsr call_CSRDON ; read leader from tape | |
B714 9E19 ldx <$19 ; start of BASIC program | |
B716 9F7E L_B716 stx <$7e ; IO buffer | |
B718 DC7E ldd <$7e | |
B71A 4C inca | |
B71B BD8335 jsr L_8335 ; memory check | |
B71E BDB93E jsr BLKIN ; read block from tape | |
B721 2613 bne L_B736 ; error | |
B723 967C lda <$7c ; block type | |
B725 270F beq L_B736 ; error | |
B727 2AED bpl L_B716 | |
B729 9F1B stx <$1b ; start of simple variables | |
B72B 8D40 bsr L_B76D ; cassette relay off | |
B72D 8E82EA ldx #text_ok - 1 | |
B730 BD90E5 jsr out_string ; print string to DEVN | |
B733 7E83E7 jmp L_83E7 ; set up new BASIC program & go command mode | |
B736 BD8417 L_B736 jsr erase_basic ; NEW BASIC | |
B739 7EB84B do_io_error_B739 jmp IO_error ; ?IO ERROR | |
B73C 9E8A L_B73C ldx <$8a ; zero | |
B73E 9DA5 jsr <$a5 ; get current character from BASIC source | |
B740 2706 beq L_B748 | |
B742 BD89AA jsr CkComa ; check comma | |
B745 BD8E83 jsr Get16Bit ; get 16 bit number into X | |
B748 B601E2 L_B748 lda >$01e2 ; file type | |
B74B 8102 cmpa #$02 ; 2 = binary | |
B74D 26BC bne do_fm_error_B70B ; ?FM ERROR | |
B74F FC01E5 ldd >$01e5 ; entry address | |
B752 338B leau d,x ; apply offset | |
B754 DF9D stu <$9d ; EXEC address | |
B756 FC01E7 ldd >$01e7 ; load address | |
B759 308B leax d,x | |
B75B 9F7E stx <$7e ; IO buffer | |
B75D BD8021 jsr call_CSRDON ; read leader from tape | |
B760 BDB93E L_B760 jsr BLKIN ; read block from tape | |
B763 26D4 bne do_io_error_B739 ; ?IO ERROR | |
B765 9F7E stx <$7e ; IO buffer | |
B767 0D7C tst <$7c ; block type | |
B769 27CE beq do_io_error_B739 ; ?IO ERROR | |
B76B 2AF3 bpl L_B760 | |
B76D 7E8018 L_B76D jmp call_CASOFF ; cassette relay off | |
B770 2705 EXEC_dispatch beq L_B777 ; * EXEC | |
B772 BD8E83 jsr Get16Bit ; get 16 bit number into X | |
B775 9F9D stx <$9d ; default EXEC address | |
B777 6E9F009D L_B777 jmp [$009d] | |
B77B BD017F L_B77B jsr >$017f ; PATCH - check break & pause | |
B77E 966F lda <$6f ; DEVN | |
B780 4C inca | |
B781 2750 beq L_B7D3 ; RTS | |
B783 7E851B jmp scan_key ; scan keyboard for break & pause | |
B786 BD8B21 L_B786 jsr L_8B21 ; get unsigned number into D & $52 from FPA1 | |
B789 8301FF subd #$01ff | |
B78C 1022D3FD lbhi FC_error ; ?FC ERROR | |
B790 C305FF addd #$05ff | |
B793 DD88 std <$88 ; text cursor address | |
B795 39 rts | |
B796 9687 INKEYstr_dispatch lda <$87 ; last key pressed | |
B798 2603 bne L_B79D ; key ready | |
B79A BD8006 jsr POLCAT ; scan keyboard | |
B79D 0F87 L_B79D clr <$87 ; last key pressed | |
B79F 9753 sta <$53 | |
B7A1 1026D630 lbne L_8DD5 ; set up character & put on varptr stack | |
B7A5 9756 sta <$56 | |
B7A7 7E8DE1 jmp L_8DE1 ; leas 2,s & put temp string on varptr stack | |
B7AA 8E01D1 L_B7AA ldx #$01d1 ; * (reads filename from command into usual location) | |
B7AD 6F80 clr ,x+ | |
B7AF 8620 lda #$20 | |
B7B1 A780 L_B7B1 sta ,x+ | |
B7B3 8C01DA cmpx #$01da ; IO buffer | |
B7B6 26F9 bne L_B7B1 | |
B7B8 9DA5 jsr <$a5 ; get current character from BASIC source | |
B7BA 2717 beq L_B7D3 ; RTS | |
B7BC BD8887 jsr get_string ; get expression | |
B7BF BD8D9A jsr L_8D9A ; validate string & point X to it (len in B) | |
B7C2 CE01D1 ldu #$01d1 | |
B7C5 E7C0 stb ,u+ ; store length | |
B7C7 270A beq L_B7D3 | |
B7C9 8C fcb $8c ; cmpx #$c608 - comment byte | |
B7CA C608 L_B7CA ldb #$08 ; usually skipped by comment byte | |
B7CC A680 L_B7CC lda ,x+ ; * copy B bytes from X to U | |
B7CE A7C0 sta ,u+ | |
B7D0 5A decb | |
B7D1 26F9 bne L_B7CC | |
B7D3 39 L_B7D3 rts | |
B7D4 BD89AA L_B7D4 jsr CkComa ; check comma | |
B7D7 8123 L_B7D7 cmpa #$23 | |
B7D9 2602 bne L_B7DD | |
B7DB 9D9F jsr <$9f ; get next character from BASIC source | |
B7DD BD8872 L_B7DD jsr L_8872 ; get numeric expression into FPA1 | |
B7E0 BD8B2D L_B7E0 jsr INTCNV ; get 16 bit number into D & $52 from FPA1 | |
B7E3 59 rolb | |
B7E4 8900 adca #$00 | |
B7E6 2669 bne DN_error ; ?DN ERROR | |
B7E8 56 rorb | |
B7E9 D76F stb <$6f ; DEVN | |
B7EB BD0161 jsr >$0161 ; PATCH - check device number | |
B7EE 2706 beq L_B7F6 | |
B7F0 2A5F bpl DN_error ; ?DN ERROR | |
B7F2 C1FE cmpb #$fe | |
B7F4 2D5B blt DN_error ; ?DN ERROR | |
B7F6 39 L_B7F6 rts | |
B7F7 8DB1 L_B7F7 bsr L_B7AA ; get filename | |
B7F9 9DA5 L_B7F9 jsr <$a5 ; get current character from BASIC source | |
B7FB 27F9 L_B7FB beq L_B7F6 ; RTS | |
B7FD 7E89B4 jmp SN_error ; ?SN ERROR | |
B800 BD0188 EOF_dispatch jsr >$0188 ; PATCH - check eof | |
B803 966F lda <$6f ; DEVN | |
B805 3402 pshs a | |
B807 8DD7 bsr L_B7E0 ; get device number from command | |
B809 BDB623 jsr L_B623 ; test cassette status OK for input | |
B80C 5F clrb | |
B80D 966F lda <$6f ; DEVN | |
B80F 2705 beq L_B816 ; VDU | |
B811 0D79 tst <$79 ; no. of characters in buffer | |
B813 2601 bne L_B816 ; not EOF | |
B815 53 comb | |
B816 3502 L_B816 puls a | |
B818 976F sta <$6f ; DEVN | |
B81A 1D L_B81A sex | |
B81B 7E8C37 jmp GIVABF ; assign D to FPA1 | |
B81E 8DD7 SKIPF_dispatch bsr L_B7F7 ; get filename | |
B820 8D58 bsr L_B87A ; find file & set up buffer | |
B822 BDB903 jsr L_B903 ; skip rest of file | |
B825 2624 bne IO_error ; ?IO ERROR | |
B827 39 rts | |
B828 BD015E OPEN_dispatch jsr >$015e ; PATCH - device open | |
B82B BD8887 jsr get_string ; get expression | |
B82E BD8DEA jsr L_8DEA ; get 1st character of string into B | |
B831 3404 pshs b | |
B833 8D9F bsr L_B7D4 ; read #-n & set up DEVN | |
B835 BD89AA jsr CkComa ; check comma | |
B838 8DBD bsr L_B7F7 ; get filename | |
B83A 966F lda <$6f ; DEVN | |
B83C 0F6F clr <$6f ; DEVN | |
B83E 3504 puls b | |
B840 C149 cmpb #$49 | |
B842 2712 beq L_B856 ; open for input | |
B844 C14F cmpb #$4f | |
B846 2742 beq L_B88A ; write filename block if A = -1 | |
B848 C62C FM_error ldb #$2c ; ?FM ERROR | |
B84A 8C fcb $8c ; cmpx #$c62a - comment byte | |
B84B C62A IO_error ldb #$2a ; usually skipped by comment byte | |
B84D 8C fcb $8c ; cmpx #$c626 - comment byte / * (B84B C62A LDB #$2A) ;?IO ERROR | |
B84E C626 AO_error ldb #$26 ; usually skipped by comment byte | |
B850 8C fcb $8c ; * (B84E C626 LDB #$26) ;?AO ERROR / cmpx #$c628 - comment byte | |
B851 C628 DN_error ldb #$28 ; usually skipped by comment byte | |
B853 7E8344 jmp system_error ; * (B851 C628 LDB #$28) ;?DN ERROR | |
B856 4C L_B856 inca ; input stream must be >= -1 | |
B857 2BEF bmi FM_error ; ?FM ERROR | |
B859 262E bne L_B889 ; return if stream <> -1 | |
B85B 8D1D bsr L_B87A ; find file & set up buffer | |
B85D B601E3 lda >$01e3 ; must be ASCII | |
B860 B401E4 anda >$01e4 ; and gapped | |
B863 27E3 beq FM_error ; ?FM ERROR | |
B865 0C78 inc <$78 ; cassette IO status | |
B867 BDB933 L_B867 jsr read_1st_block ; read leader & block from tape | |
B86A 26DF bne IO_error ; ?IO ERROR | |
B86C 0D7C tst <$7c ; block must be data or EOF | |
B86E 27DB beq IO_error ; ?IO ERROR | |
B870 2B17 bmi L_B889 ; return if EOF block | |
B872 967D lda <$7d ; block length | |
B874 27F1 beq L_B867 ; get another block if zero length | |
B876 9779 L_B876 sta <$79 ; no. of characters in buffer | |
B878 200A bra L_B884 ; finish setting up buffer | |
B87A 0D78 L_B87A tst <$78 ; cassette IO status | |
B87C 26D0 bne AO_error ; ?AO ERROR | |
B87E 8D33 bsr find_file ; find file | |
B880 26C9 bne IO_error ; ?IO ERROR | |
B882 0F79 L_B882 clr <$79 ; no. of characters in buffer | |
B884 8E01DA L_B884 ldx #$01da ; IO buffer | |
B887 9F7A stx <$7a ; buffer pointer | |
B889 39 L_B889 rts | |
B88A 4C L_B88A inca ; * if A = -1 then write filename block for gapped ASCII | |
B88B 26FC bne L_B889 ; RTS | |
B88D 4C inca ; A = 1 | |
B88E 8EFFFF L_B88E ldx #$ffff ; * write filename block for gapped ASCII (file type in A) | |
B891 0D78 L_B891 tst <$78 ; cassette IO status | |
B893 26B9 bne AO_error ; ?AO ERROR | |
B895 CE01DA ldu #$01da ; IO buffer | |
B898 DF7E stu <$7e | |
B89A A748 sta 8,u ; file type | |
B89C AF49 stx 9,u ; ASCII flag & gap flag | |
B89E 8E01D2 ldx #$01d2 ; filename | |
B8A1 BDB7CA jsr L_B7CA ; copy 8 bytes from X to U | |
B8A4 0F7C clr <$7c ; block type | |
B8A6 860F lda #$0f | |
B8A8 977D sta <$7d ; block length | |
B8AA BDB991 jsr L_B991 ; write leader & block to tape | |
B8AD 8602 lda #$02 ; 2 = output | |
B8AF 9778 sta <$78 ; cassette IO status | |
B8B1 20CF bra L_B882 ; reset IO buffer | |
B8B3 8E01DA find_file ldx #$01da ; IO buffer | |
B8B6 9F7E stx <$7e | |
B8B8 9668 L_B8B8 lda <$68 ; current line number | |
B8BA 4C inca | |
B8BB 260B bne L_B8C8 ; not in command mode | |
B8BD BDBA77 jsr clear_screen ; clear screen | |
B8C0 9E88 ldx <$88 ; text cursor address | |
B8C2 C653 ldb #$53 | |
B8C4 E781 stb ,x++ | |
B8C6 9F88 stx <$88 ; text cursor address | |
B8C8 8D69 L_B8C8 bsr read_1st_block ; read leader & block from tape | |
B8CA DA7C orb <$7c ; block type | |
B8CC 26FA bne L_B8C8 ; keep going until filename block loaded | |
B8CE 8E01DA ldx #$01da ; IO buffer | |
B8D1 CE01D2 ldu #$01d2 ; filename to find | |
B8D4 C608 ldb #$08 | |
B8D6 6FE2 clr ,-s | |
B8D8 A680 L_B8D8 lda ,x+ | |
B8DA 109E68 ldy <$68 ; current line number | |
B8DD 3121 leay 1,y | |
B8DF 2605 bne L_B8E6 ; not in command mode | |
B8E1 0F6F clr <$6f ; DEVN | |
B8E3 BDB54A jsr OUTCHR ; output character to DEVN | |
B8E6 A0C0 L_B8E6 suba ,u+ | |
B8E8 AAE4 ora ,s | |
B8EA A7E4 sta ,s | |
B8EC 5A decb | |
B8ED 26E9 bne L_B8D8 | |
B8EF A6E0 lda ,s+ | |
B8F1 270A beq L_B8FD ; matched filename | |
B8F3 6D57 tst -9,u | |
B8F5 2706 beq L_B8FD ; no filename specified | |
B8F7 8D0A bsr L_B903 ; skip rest of file | |
B8F9 2607 bne L_B902 ; return with error | |
B8FB 20BB bra L_B8B8 ; try next file | |
B8FD 8646 L_B8FD lda #$46 | |
B8FF 8D29 bsr L_B92A ; display 'F' | |
B901 4F clra | |
B902 39 L_B902 rts | |
B903 7D01E4 L_B903 tst >$01e4 ; gap flag | |
B906 2609 bne L_B911 ; gapped file | |
B908 BD8021 jsr call_CSRDON ; read leader from tape | |
B90B 8D31 L_B90B bsr BLKIN ; read block from tape | |
B90D 8D08 bsr L_B917 ; test file status | |
B90F 20FA bra L_B90B ; do next block | |
B911 8D20 L_B911 bsr read_1st_block ; read leader & block from tape | |
B913 8D02 bsr L_B917 ; test file status | |
B915 20FA bra L_B911 ; do next block | |
B917 2606 L_B917 bne L_B91F ; * test file status | |
B919 967C lda <$7c ; block type | |
B91B 40 nega | |
B91C 2B14 bmi L_B932 ; normal block - RTS | |
B91E 4A deca | |
B91F 9781 L_B91F sta <$81 ; error status | |
B921 3262 leas 2,s | |
B923 2013 bra L_B938 ; cassette relay off & get status in B | |
B925 B60400 flash_0400 lda >$0400 ; * flash loading cursor | |
B928 8840 eora #$40 | |
B92A D668 L_B92A ldb <$68 ; current line number | |
B92C 5C incb | |
B92D 2603 bne L_B932 ; not in command mode | |
B92F B70400 sta >$0400 | |
B932 39 L_B932 rts | |
B933 BD8021 read_1st_block jsr call_CSRDON ; read leader from tape | |
B936 8D06 bsr BLKIN ; read block from tape | |
B938 BD8018 L_B938 jsr call_CASOFF ; cassette relay off | |
B93B D681 ldb <$81 ; error status | |
B93D 39 rts | |
B93E 1A50 BLKIN orcc #$50 ; mask interrupts | |
B940 8DE3 bsr flash_0400 ; flash loading cursor | |
B942 9E7E ldx <$7e ; IO buffer | |
B944 4F clra | |
B945 BD8027 L_B945 jsr call_BITIN ; bit in | |
B948 46 rora | |
B949 813C cmpa #$3c | |
B94B 26F8 bne L_B945 ; wait for sync byte | |
B94D BD8024 jsr call_CBIN ; byte in | |
B950 977C sta <$7c ; block type | |
B952 BD8024 jsr call_CBIN ; byte in | |
B955 977D sta <$7d ; block length | |
B957 9B7C adda <$7c ; block type | |
B959 9780 sta <$80 ; checksum | |
B95B 967D lda <$7d ; block length | |
B95D 9781 sta <$81 ; use error status as counter | |
B95F 2711 beq L_B972 ; no data | |
B961 BD8024 L_B961 jsr call_CBIN ; byte in | |
B964 A784 sta ,x | |
B966 A180 cmpa ,x+ ; check that we are loading into RAM | |
B968 2612 bne L_B97C | |
B96A 9B80 adda <$80 | |
B96C 9780 sta <$80 ; checksum | |
B96E 0A81 dec <$81 | |
B970 26EF bne L_B961 ; get next data byte | |
B972 BD8024 L_B972 jsr call_CBIN ; byte in | |
B975 9080 suba <$80 ; checksum | |
B977 2705 beq L_B97E ; status = OK | |
B979 8601 lda #$01 ; status = CRC error | |
B97B 8C fcb $8c ; cmpx #RG_error - comment byte | |
B97C 8602 L_B97C lda #$02 ; usually skipped by comment byte | |
B97E 9781 L_B97E sta <$81 ; status | |
B980 39 rts | |
B981 1F89 MOTOR_dispatch tfr a,b ; * MOTOR | |
B983 9D9F jsr <$9f ; get next character from BASIC source | |
B985 C1C2 cmpb #$c2 ; token OFF | |
B987 270D beq L_B996 ; cassette relay off | |
B989 C188 cmpb #$88 ; token ON | |
B98B BDB7FB jsr L_B7FB ; ?SN ERROR if <>0 | |
B98E 7E8015 jmp call_CASON ; cassette relay on | |
B991 BD801B L_B991 jsr call_WRTLDR ; write leader | |
B994 8D03 L_B994 bsr BLKOUT ; write block to tape | |
B996 7E8018 L_B996 jmp call_CASOFF ; cassette relay off | |
B999 1A50 BLKOUT orcc #$50 ; mask interrupts | |
B99B D67D ldb <$7d ; block length | |
B99D D781 stb <$81 ; use error status as counter | |
B99F 967D lda <$7d ; block length | |
B9A1 2707 beq L_B9AA ; no data | |
B9A3 9E7E ldx <$7e ; IO buffer address | |
B9A5 AB80 L_B9A5 adda ,x+ | |
B9A7 5A decb | |
B9A8 26FB bne L_B9A5 ; calculate checksum | |
B9AA 9B7C L_B9AA adda <$7c ; block type | |
B9AC 9780 sta <$80 ; checksum | |
B9AE 9E7E ldx <$7e ; IO buffer address | |
B9B0 8D1B bsr L_B9CD ; write single leader byte | |
B9B2 863C lda #$3c ; sync byte | |
B9B4 8D19 bsr L_B9CF ; byte out | |
B9B6 967C lda <$7c ; block type | |
B9B8 8D15 bsr L_B9CF ; byte out | |
B9BA 967D lda <$7d ; block length | |
B9BC 8D11 bsr L_B9CF ; byte out | |
B9BE 4D tsta | |
B9BF 2708 beq L_B9C9 ; no data | |
B9C1 A680 L_B9C1 lda ,x+ | |
B9C3 8D0A bsr L_B9CF ; byte out | |
B9C5 0A81 dec <$81 | |
B9C7 26F8 bne L_B9C1 ; keep going until all data sent | |
B9C9 9680 L_B9C9 lda <$80 ; checksum | |
B9CB 8D02 bsr L_B9CF ; byte out | |
B9CD 8655 L_B9CD lda #$55 ; leader byte | |
B9CF 7E801E L_B9CF jmp call_CBOUT ; byte out | |
B9D2 8D3F SET_dispatch bsr L_BA13 ; read coords & calc pixel | |
B9D4 3410 pshs x | |
B9D6 BD8E7E jsr L_8E7E ; skip comma & get number in B | |
B9D9 3510 puls x | |
B9DB C108 cmpb #$08 | |
B9DD 2245 bhi L_BA24 ; ?FC ERROR | |
B9DF 5A decb | |
B9E0 2B05 bmi L_B9E7 ; black | |
B9E2 8610 lda #$10 | |
B9E4 3D mul | |
B9E5 2008 bra L_B9EF | |
B9E7 E684 L_B9E7 ldb ,x | |
B9E9 2A03 bpl L_B9EE ; non-graphics block present | |
B9EB C470 andb #$70 | |
B9ED 21 fcb $21 ; brn L_BA4E - comment byte | |
B9EE 5F L_B9EE clrb ; usually skipped by comment byte | |
B9EF 3404 L_B9EF pshs b ; * (B9EE 5F CLRB) | |
B9F1 8D69 bsr L_BA5C ; skip close bracket | |
B9F3 A684 lda ,x | |
B9F5 2B01 bmi L_B9F8 | |
B9F7 4F clra ; non-graphics block present | |
B9F8 840F L_B9F8 anda #$0f | |
B9FA 9A86 ora <$86 ; lo-res pixel mask | |
B9FC AAE0 ora ,s+ | |
B9FE 8A80 L_B9FE ora #$80 | |
BA00 A784 sta ,x | |
BA02 39 rts | |
BA03 8D0E RESET_dispatch bsr L_BA13 ; read coords & calc pixel | |
BA05 8D55 bsr L_BA5C ; skip close bracket | |
BA07 4F clra | |
BA08 E684 ldb ,x | |
BA0A 2AF2 bpl L_B9FE | |
BA0C 0386 com <$86 ; lo-res pixel mask | |
BA0E D486 andb <$86 | |
BA10 E784 stb ,x | |
BA12 39 rts | |
BA13 BD89A7 L_BA13 jsr CkOpBrak ; skip open bracket | |
BA16 BD8E51 L_BA16 jsr Get8Bit ; get number in B | |
BA19 C13F cmpb #$3f | |
BA1B 2207 bhi L_BA24 ; ?FC ERROR | |
BA1D 3404 pshs b | |
BA1F BD8E7E jsr L_8E7E ; skip comma & get number in B | |
BA22 C11F cmpb #$1f | |
BA24 2271 L_BA24 bhi do_fc_error_BA97 ; ?FC ERROR | |
BA26 3404 pshs b | |
BA28 54 lsrb | |
BA29 8620 lda #$20 | |
BA2B 3D mul | |
BA2C 8E0400 ldx #$0400 | |
BA2F 308B leax d,x | |
BA31 E661 ldb 1,s | |
BA33 54 lsrb | |
BA34 3A abx | |
BA35 3506 puls a,b | |
BA37 8401 anda #$01 | |
BA39 56 rorb | |
BA3A 49 rola | |
BA3B C610 ldb #$10 | |
BA3D 54 L_BA3D lsrb | |
BA3E 4A deca | |
BA3F 2AFC bpl L_BA3D | |
BA41 D786 stb <$86 ; lo-res pixel mask | |
BA43 39 rts | |
BA44 8DD0 POINT_dispatch bsr L_BA16 ; read coords | |
BA46 C6FF ldb #$ff | |
BA48 A684 lda ,x | |
BA4A 2A0D bpl L_BA59 ; non-graphics block | |
BA4C 9486 anda <$86 ; lo-res pixel mask | |
BA4E 2708 L_BA4E beq L_BA58 | |
BA50 E684 ldb ,x | |
BA52 54 lsrb | |
BA53 54 lsrb | |
BA54 54 lsrb | |
BA55 54 lsrb | |
BA56 C407 andb #$07 | |
BA58 5C L_BA58 incb | |
BA59 BDB81A L_BA59 jsr L_B81A ; return number to BASIC | |
BA5C 7E89A4 L_BA5C jmp CkClBrak ; skip close bracket | |
BA5F BD01A0 CLS_dispatch jsr >$01a0 ; PATCH - CLS GET PUT | |
BA62 2713 beq clear_screen ; no parameter - clear to spaces | |
BA64 BD8E51 jsr Get8Bit ; get number in B | |
BA67 C108 cmpb #$08 | |
BA69 221B bhi clear_screen_ms ; CLS 9+ | |
BA6B 5D tstb | |
BA6C 2706 beq L_BA74 ; CLS 0 | |
BA6E 5A decb | |
BA6F 8610 lda #$10 | |
BA71 3D mul | |
BA72 CA0F orb #$0f | |
BA74 CA80 L_BA74 orb #$80 | |
BA76 8C fcb $8c ; cmpx #$c660 - comment byte | |
BA77 C660 clear_screen ldb #$60 ; usually skipped by comment byte | |
BA79 8E0400 ldx #$0400 ; * (BA77 C660 LDB #$60) | |
BA7C 9F88 stx <$88 ; text cursor address | |
BA7E E780 L_BA7E stb ,x+ | |
BA80 8C05FF cmpx #$05ff | |
BA83 23F9 bls L_BA7E | |
BA85 39 rts | |
BA86 8DEF clear_screen_ms bsr clear_screen ; clear screen | |
BA88 8EB4EC ldx #copyright_ms - 1 | |
BA8B 7E90E5 jmp out_string ; print string to DEVN | |
BA8E BD89AA L_BA8E jsr CkComa ; check comma | |
BA91 BD8E51 L_BA91 jsr Get8Bit ; get number in B | |
BA94 5D tstb | |
BA95 263C bne L_BAD3 ; RTS | |
BA97 7E8B8D do_fc_error_BA97 jmp FC_error ; ?FC ERROR | |
BA9A 8DF5 SOUND_dispatch bsr L_BA91 ; get pitch | |
BA9C D78C stb <$8c ; pitch | |
BA9E 8DEE bsr L_BA8E ; skip comma & get duration | |
BAA0 8604 lda #$04 | |
BAA2 3D mul | |
BAA3 DD8D std <$8d ; duration x 4 | |
BAA5 B6FF03 lda >$ff03 | |
BAA8 8A01 ora #$01 | |
BAAA B7FF03 sta >$ff03 ; enable vsync irq | |
BAAD 12 nop | |
BAAE 5F clrb | |
BAAF 8D40 bsr L_BAF1 ; B=0 to select d/a sound | |
BAB1 8D12 bsr L_BAC5 ; enable audio | |
BAB3 8D1F L_BAB3 bsr L_BAD4 ; centre d/a | |
BAB5 86FC lda #$fc | |
BAB7 8D1D bsr L_BAD6 ; max d/a | |
BAB9 8D19 bsr L_BAD4 ; centre d/a | |
BABB 8600 lda #$00 | |
BABD 8D17 bsr L_BAD6 ; min d/a | |
BABF 9E8D ldx <$8d ; loop until irq routine | |
BAC1 26F0 bne L_BAB3 ; decrements duration to zero | |
BAC3 4F L_BAC3 clra ; * disable audio | |
BAC4 8C fcb $8c ; cmpx #do_sn_error_860A - 2 - comment byte | |
BAC5 8608 L_BAC5 lda #$08 ; usually skipped by comment byte | |
BAC7 A7E2 sta ,-s ; * (BAC5 8608 LDA #$08) | |
BAC9 B6FF23 lda >$ff23 | |
BACC 84F7 anda #$f7 | |
BACE AAE0 ora ,s+ | |
BAD0 B7FF23 sta >$ff23 | |
BAD3 39 L_BAD3 rts | |
BAD4 867C L_BAD4 lda #$7c ; * reset D/A and delay | |
BAD6 B7FF20 L_BAD6 sta >$ff20 ; * store A in D/A and delay | |
BAD9 968C lda <$8c ; SOUND pitch value | |
BADB 4C L_BADB inca | |
BADC 26FD bne L_BADB | |
BADE 39 rts | |
BADF 1F89 AUDIO_dispatch tfr a,b ; * AUDIO | |
BAE1 9D9F jsr <$9f ; get next character from BASIC source | |
BAE3 C1C2 cmpb #$c2 ; token OFF | |
BAE5 27DC beq L_BAC3 | |
BAE7 C088 subb #$88 ; token ON | |
BAE9 BDB7FB jsr L_B7FB ; ?SN ERROR if <>0 | |
BAEC 5C incb | |
BAED 8D02 bsr L_BAF1 ; B=1 for cassette sound | |
BAEF 20D4 bra L_BAC5 ; enable audio | |
BAF1 CEFF01 L_BAF1 ldu #$ff01 ; * select sound source | |
BAF4 8D00 bsr L_BAF6 | |
BAF6 A6C4 L_BAF6 lda ,u | |
BAF8 84F7 anda #$f7 | |
BAFA 57 asrb | |
BAFB 2402 bcc L_BAFF | |
BAFD 8A08 ora #$08 | |
BAFF A7C1 L_BAFF sta ,u++ | |
BB01 39 rts | |
BB02 BE008D L_BB02 ldx >$008d ; SOUND counter | |
BB05 2705 beq L_BB0C | |
BB07 301F leax -1,x | |
BB09 BF008D stx >$008d ; SOUND counter | |
BB0C 3B L_BB0C rti | |
BB0D BD8E54 JOYSTK_dispatch jsr L_8E54 ; get number in B from FPA1 | |
BB10 C103 cmpb #$03 | |
BB12 1022D077 lbhi FC_error ; ?FC ERROR | |
BB16 5D tstb | |
BB17 2603 bne L_BB1C | |
BB19 BD8012 jsr call_JOYIN ; update joysticks if B = 0 | |
BB1C 8E015A L_BB1C ldx #$015a ; joystick value table | |
BB1F D653 ldb <$53 ; get number again | |
BB21 E685 ldb b,x | |
BB23 7E8C36 jmp Assign8Bit ; assign B to FPA1 | |
BB26 813A chrget_next cmpa #$3a ; * character is a digit | |
BB28 240A bcc L_BB34 ; higher than '9' | |
BB2A 8120 cmpa #$20 | |
BB2C 2602 bne L_BB30 ; not a space | |
BB2E 0E9F jmp <$9f ; get next character from BASIC source | |
BB30 8030 L_BB30 suba #$30 | |
BB32 80D0 suba #$d0 ; set carry if >= '0' | |
BB34 39 L_BB34 rts | |
BB35 00000000000000 fcb $00,$00,$00,$00,$00,$00,$00 ; * unused | |
BB3C CC0034 HWINIT ldd #$0034 ; initialise PIA0: | |
BB3F 8EFF00 ldx #$ff00 ; $FF00 PDR rrrrrrrr | |
BB42 A701 sta 1,x ; $FF02 PDR wwwwwwww | |
BB44 A703 sta 3,x ; CA2 bit3 output mode | |
BB46 A784 sta ,x ; CB2 bit3 output mode | |
BB48 43 coma ; IRQA disabled (hsync) | |
BB49 A702 sta 2,x ; IRQB disabled (vsync) | |
BB4B E701 stb 1,x | |
BB4D E703 stb 3,x | |
BB4F 8EFF20 ldx #$ff20 ; initialise PIA1: | |
BB52 6F01 clr 1,x ; $FF20 PDR wwwwwwwr | |
BB54 6F03 clr 3,x ; $FF22 PDR wwwwwrrr | |
BB56 4A deca ; CA2 bit3 output mode | |
BB57 A784 sta ,x ; CB2 bit3 output mode | |
BB59 86F8 lda #$f8 ; IRQA disabled (ack) | |
BB5B A702 sta 2,x ; IRQB disabled (cart) | |
BB5D E701 stb 1,x | |
BB5F E703 stb 3,x | |
BB61 6F84 clr ,x | |
BB63 6F02 clr 2,x | |
BB65 CC0A98 ldd #$0a98 ; initialise serial hardware: | |
BB68 FDFF06 std >$ff06 ; no parity, no IRQ, DTR low | |
BB6B B6FF04 lda >$ff04 ; 1200 baud, 8 data, 2 stop | |
BB6E 8EFFC0 ldx #$ffc0 ; initialise SAM: | |
BB71 C610 ldb #$10 ; 512 byte display | |
BB73 A781 L_BB73 sta ,x++ ; display base 1024 | |
BB75 5A decb ; mem page 0 | |
BB76 26FB bne L_BB73 ; slow MPU rate | |
BB78 F7FFC9 stb >$ffc9 ; 64K dynamic memory | |
BB7B F7FFDD stb >$ffdd ; MAP 0 | |
BB7E 2003 bra L_BB83 | |
BB80 7EBF49 call_BOOT64K jmp BOOT64K ; * boot 64K BASIC | |
BB83 5F L_BB83 clrb ; * reset routine continued | |
BB84 1F9B tfr b,dp | |
BB86 1F25 tfr y,pc ; JMP to $B39B | |
BB88 8EBB9F SWINIT ldx #copy_to_008F ; * part of start up reset routine | |
BB8B CE008F ldu #$008f | |
BB8E C60D ldb #$0d | |
BB90 8D05 bsr L_BB97 ; copy B bytes from X to U | |
BB92 BDBEFF jsr L_BEFF ; set up serial printer parameters | |
BB95 C609 ldb #$09 | |
BB97 A680 L_BB97 lda ,x+ | |
BB99 A7C0 sta ,u+ | |
BB9B 5A decb | |
BB9C 26F9 bne L_BB97 ; copy B bytes from X to U | |
BB9E 39 rts | |
BB9F 320100120A12DA5C045E107484 copy_to_008F fcb $32,$01,$00,$12,$0a,$12,$da,$5c,$04,$5e,$10,$74,$84 ; * key scan delay, printer parameters) | |
BBAC FFFF010D0A00000000 copy_to_0148 fcb $ff,$ff,$01,$0d,$0a,$00,$00,$00,$00 ; * (auto LF flag, caps flag, printer EOL sequence) | |
BBB5 0A8F CBLINK dec <$8f ; cursor flash counter | |
BBB7 260C bne delay_1ms | |
BBB9 8632 lda #$32 | |
BBBB 978F sta <$8f ; cursor flash counter | |
BBBD 9E88 ldx <$88 ; text cursor address | |
BBBF A684 lda ,x | |
BBC1 8840 eora #$40 | |
BBC3 A784 sta ,x | |
BBC5 8E045E delay_1ms ldx #$045e | |
BBC8 301F delay_X leax -1,x | |
BBCA 26FC bne delay_X | |
BBCC 39 rts | |
BBCD F6FF00 L_BBCD ldb >$ff00 ; * read key matrix & mask SHIFT key | |
BBD0 CA80 orb #$80 ; mask analogue comp. | |
BBD2 7DFF02 tst >$ff02 | |
BBD5 2B02 bmi L_BBD9 | |
BBD7 CA40 orb #$40 | |
BBD9 39 L_BBD9 rts | |
BBDA C67F check_shift ldb #$7f ; * test for SHIFT key | |
BBDC F7FF02 stb >$ff02 | |
BBDF F6FF00 ldb >$ff00 | |
BBE2 C440 andb #$40 | |
BBE4 39 rts | |
BBE5 3414 INCH pshs b,x ; * scan keyboard & return ASCII | |
BBE7 8D03 bsr L_BBEC | |
BBE9 7EBEE0 jmp L_BEE0 | |
BBEC 327E L_BBEC leas -2,s | |
BBEE 8E0151 ldx #$0151 ; key rollover table | |
BBF1 7FFF02 clr >$ff02 ; test all keys | |
BBF4 F6FF00 ldb >$ff00 | |
BBF7 CA80 orb #$80 ; mask analogue comp. | |
BBF9 E184 cmpb ,x | |
BBFB 2772 beq L_BC6F ; nothing changed - return NUL | |
BBFD 1F98 tfr b,a | |
BBFF 73FF02 com >$ff02 ; disable all keys | |
BC02 8DC9 bsr L_BBCD ; read matrix & mask shift | |
BC04 C1FF cmpb #$ff | |
BC06 2667 bne L_BC6F ; joystick button pressed - return NUL | |
BC08 A780 sta ,x+ ; $0151 = keyboard state | |
BC0A 6FE4 clr ,s ; row counter | |
BC0C C6FE ldb #$fe | |
BC0E F7FF02 stb >$ff02 | |
BC11 8DBA L_BC11 bsr L_BBCD ; read matrix & mask shift | |
BC13 E761 stb 1,s | |
BC15 E884 eorb ,x | |
BC17 E484 andb ,x ; sets bits in B for new keys pressed | |
BC19 A661 lda 1,s | |
BC1B A780 sta ,x+ ; save new scan code | |
BC1D 5D tstb | |
BC1E 260A bne L_BC2A ; new keys pressed | |
BC20 6CE4 inc ,s | |
BC22 43 coma ; set carry | |
BC23 79FF02 rol >$ff02 ; next row | |
BC26 25E9 bcs L_BC11 ; more rows to do | |
BC28 2045 bra L_BC6F ; no new keys pressed - return NUL | |
BC2A 9E97 L_BC2A ldx <$97 | |
BC2C 8D9A bsr delay_X ; debounce delay | |
BC2E 1E89 exg a,b | |
BC30 8D9B bsr L_BBCD ; read matrix & mask shift | |
BC32 E161 cmpb 1,s | |
BC34 1E89 exg a,b | |
BC36 2637 bne L_BC6F ; key state changed during delay - return NUL | |
BC38 A6E4 lda ,s ; row number | |
BC3A 8008 suba #$08 | |
BC3C 8B08 L_BC3C adda #$08 ; convert scan code into a number | |
BC3E 54 lsrb ; between 0 and 54 | |
BC3F 24FB bcc L_BC3C ; (nb. shift masked out) | |
BC41 4D tsta | |
BC42 2732 beq L_BC76 ; zero key | |
BC44 810C cmpa #$0c | |
BC46 2517 bcs L_BC5F ; keys 1 to 9 : ; | |
BC48 8111 cmpa #$11 | |
BC4A 2528 bcs L_BC74 ; keys , - . / @ | |
BC4C 812A cmpa #$2a | |
BC4E 2222 bhi L_BC72 ; arrows SPC RET CLR BRK | |
BC50 8B30 adda #$30 ; ASCII A - Z | |
BC52 8D86 bsr check_shift ; test for SHIFT key | |
BC54 2712 beq L_BC68 ; SHIFT pressed | |
BC56 7D0149 tst >$0149 ; CAPS flag | |
BC59 260D bne L_BC68 ; upper case | |
BC5B 8A20 ora #$20 ; convert to lower case | |
BC5D 2009 bra L_BC68 | |
BC5F 8B30 L_BC5F adda #$30 ; ASCII 1 to 9 : ; | |
BC61 17FF76 lbsr check_shift ; test for SHIFT key | |
BC64 2602 bne L_BC68 ; SHIFT not pressed | |
BC66 8010 suba #$10 | |
BC68 8112 L_BC68 cmpa #$12 | |
BC6A 2604 bne L_BC70 ; not shift + 0 | |
BC6C 730149 com >$0149 ; CAPS flag | |
BC6F 4F L_BC6F clra | |
BC70 3590 L_BC70 puls x,pc | |
BC72 801A L_BC72 suba #$1a ; * XLAT key scan code to ASCII | |
BC74 800B L_BC74 suba #$0b | |
BC76 48 L_BC76 lsla | |
BC77 17FF60 lbsr check_shift ; test for SHIFT key | |
BC7A 2601 bne L_BC7D | |
BC7C 4C inca | |
BC7D 8EBC84 L_BC7D ldx #kbd_map_00 | |
BC80 A686 lda a,x | |
BC82 20E4 bra L_BC68 | |
BC84 3012 kbd_map_00 fcb $30,$12 ; 0 , | |
BC86 2C3C2D3D2E3E2F3F4013 kbd_map_0c_10 fcb $2c,$3c,$2d,$3d,$2e,$3e,$2f,$3f,$40,$13 | |
BC90 5E5F0A5B0815095D20200D0D0C5C0303 kbd_map_2b_32 fcb $5e,$5f,$0a,$5b,$08,$15,$09,$5d,$20,$20,$0d,$0d,$0c,$5c,$03,$03 ; CU CD | |
BCA0 8660 clear_to_eol lda #$60 ; * clear VDU line + CR/LF | |
BCA2 A780 sta ,x+ | |
BCA4 1F10 tfr x,d | |
BCA6 C41F andb #$1f | |
BCA8 26F6 bne clear_to_eol | |
BCAA 39 rts | |
BCAB 3416 OUTCH pshs a,b,x ; * write character to VDU | |
BCAD 9E88 ldx <$88 ; text cursor address | |
BCAF 8108 cmpa #$08 | |
BCB1 260B bne L_BCBE | |
BCB3 8C0400 cmpx #$0400 ; backspace | |
BCB6 273B beq L_BCF3 | |
BCB8 8660 lda #$60 | |
BCBA A782 sta ,-x | |
BCBC 201D bra L_BCDB | |
BCBE 810D L_BCBE cmpa #$0d ; return | |
BCC0 2604 bne L_BCC6 | |
BCC2 8DDC bsr clear_to_eol ; clear VDU line + CR/LF | |
BCC4 2015 bra L_BCDB | |
BCC6 8120 L_BCC6 cmpa #$20 | |
BCC8 2529 bcs L_BCF3 ; chr < $20 | |
BCCA 4D tsta | |
BCCB 2B0C bmi L_BCD9 ; chr >= 128 | |
BCCD 8140 cmpa #$40 | |
BCCF 2506 bcs L_BCD7 ; $20 <= chr < $40 | |
BCD1 8160 cmpa #$60 | |
BCD3 2504 bcs L_BCD9 ; $40 <= chr < $60 | |
BCD5 84DF anda #$df | |
BCD7 8840 L_BCD7 eora #$40 | |
BCD9 A780 L_BCD9 sta ,x+ | |
BCDB 9F88 L_BCDB stx <$88 ; text cursor address | |
BCDD 8C05FF cmpx #$05ff | |
BCE0 2311 bls L_BCF3 | |
BCE2 8E0400 ldx #$0400 ; scroll | |
BCE5 EC8820 L_BCE5 ldd <$20,x | |
BCE8 ED81 std ,x++ | |
BCEA 8C05E0 cmpx #$05e0 | |
BCED 25F6 bcs L_BCE5 | |
BCEF 9F88 stx <$88 ; text cursor address | |
BCF1 8DAD bsr clear_to_eol ; clear VDU line + CR/LF | |
BCF3 3596 L_BCF3 puls a,b,x,pc | |
BCF5 3404 TXLPCH pshs b ; * write character direct to printer | |
BCF7 7D03FF tst >$03ff ; printer type flag | |
BCFA 7EBEC5 jmp L_BEC5 ; continued... | |
BCFD B7FF02 L_BCFD sta >$ff02 ; * write character to parallel port | |
BD00 C602 ldb #$02 | |
BD02 F7FF20 stb >$ff20 | |
BD05 7FFF20 clr >$ff20 ; strobe | |
BD08 3584 puls b,pc | |
BD0A 8E014A L_BD0A ldx #$014a ; * send EOL characters to printer | |
BD0D E680 ldb ,x+ | |
BD0F 5D L_BD0F tstb | |
BD10 2707 beq L_BD19 | |
BD12 A680 lda ,x+ | |
BD14 8DDF bsr TXLPCH ; send character direct to printer | |
BD16 7EBF0C jmp L_BF0C ; continued... | |
BD19 39 L_BD19 rts | |
BD1A 3416 LPOUT pshs a,b,x ; * write character to printer | |
BD1C 810D cmpa #$0d | |
BD1E 2713 beq L_BD33 | |
BD20 8120 cmpa #$20 | |
BD22 2502 bcs L_BD26 ; don't advance head pos for CTRL chrs | |
BD24 0C9C inc <$9c ; printer head pos | |
BD26 8DCD L_BD26 bsr TXLPCH ; send character to printer | |
BD28 D69C ldb <$9c ; printer head pos | |
BD2A D19B cmpb <$9b ; printer line width | |
BD2C 2511 bcs L_BD3F | |
BD2E 7D0148 tst >$0148 ; printer auto LF flag | |
BD31 260A bne L_BD3D | |
BD33 0D9C L_BD33 tst <$9c ; printer head pos | |
BD35 2604 bne L_BD3B | |
BD37 8620 lda #$20 | |
BD39 8DBA bsr TXLPCH ; send character to printer | |
BD3B 8DCD L_BD3B bsr L_BD0A ; send EOL sequence | |
BD3D 0F9C L_BD3D clr <$9c ; printer head pos | |
BD3F 3596 L_BD3F puls a,b,x,pc | |
BD41 CEFF01 SNDSEL ldu #$ff01 ; * select joystick source B (0-3) | |
BD44 8D00 bsr L_BD46 | |
BD46 A6C4 L_BD46 lda ,u | |
BD48 84F7 anda #$f7 | |
BD4A 56 rorb | |
BD4B 2402 bcc L_BD4F | |
BD4D 8A08 ora #$08 | |
BD4F A7C1 L_BD4F sta ,u++ | |
BD51 39 rts | |
BD52 327D JOYIN leas -3,s ; * (reads each channel up to 10 times until stable result is obtained) | |
BD54 8E015E ldx #$015e ; end of joystick table + 1 | |
BD57 C603 ldb #$03 | |
BD59 860A L_BD59 lda #$0a | |
BD5B ED61 std 1,s | |
BD5D 8DE2 bsr SNDSEL ; select joystick source B | |
BD5F CC4080 L_BD5F ldd #$4080 | |
BD62 A7E4 L_BD62 sta ,s | |
BD64 F7FF20 stb >$ff20 | |
BD67 7DFF00 tst >$ff00 ; test analogue comp. | |
BD6A 2B04 bmi L_BD70 ; approximation low | |
BD6C E0E4 subb ,s ; try smaller value | |
BD6E 2002 bra L_BD72 | |
BD70 EBE4 L_BD70 addb ,s ; try larger value | |
BD72 44 L_BD72 lsra | |
BD73 8101 cmpa #$01 | |
BD75 26EB bne L_BD62 ; do finer approximation | |
BD77 54 lsrb | |
BD78 54 lsrb ; convert range to 0-63 | |
BD79 E11F cmpb -1,x | |
BD7B 2704 beq L_BD81 ; reading stable | |
BD7D 6A61 dec 1,s | |
BD7F 26DE bne L_BD5F ; do up to 10 readings until stable | |
BD81 E782 L_BD81 stb ,-x | |
BD83 E662 ldb 2,s | |
BD85 5A decb | |
BD86 2AD1 bpl L_BD59 ; do next joystick channel | |
BD88 3592 puls a,x,pc | |
BD8A 0C82 sample_cas inc <$82 ; wavelength timer | |
BD8C F6FF20 ldb >$ff20 | |
BD8F 56 rorb | |
BD90 39 rts | |
BD91 0F82 tape_wait_2p clr <$82 ; wavelength timer | |
BD93 0D84 tst <$84 ; phase flag | |
BD95 2607 bne tape_wait_p1_p0 ; time antiphase wave | |
BD97 8D07 tape_wait_p0_p1 bsr tape_wait_p0 ; time +ve going wave | |
BD99 8DEF tape_wait_p1 bsr sample_cas ; read cassette input & update timer | |
BD9B 24FC bcc tape_wait_p1 | |
BD9D 39 rts | |
BD9E 8DF9 tape_wait_p1_p0 bsr tape_wait_p1 ; time -ve going wave | |
BDA0 8DE8 tape_wait_p0 bsr sample_cas ; read cassette input & update timer | |
BDA2 25FC bcs tape_wait_p0 | |
BDA4 39 rts | |
BDA5 8DEA BITIN bsr tape_wait_2p ; * read bit from tape into carry | |
BDA7 D682 ldb <$82 ; wavelength timer | |
BDA9 5A decb | |
BDAA D192 cmpb <$92 ; wavelength threshold | |
BDAC 39 rts | |
BDAD 8608 CBIN lda #$08 ; * read byte from tape into A | |
BDAF 9783 sta <$83 | |
BDB1 8DF2 L_BDB1 bsr BITIN ; read bit from tape into carry | |
BDB3 46 rora ; LSB first | |
BDB4 0A83 dec <$83 | |
BDB6 26F9 bne L_BDB1 ; do next bit | |
BDB8 39 rts | |
BDB9 0F82 tape_cmp_p1_1200 clr <$82 ; wavelength timer | |
BDBB 8DE3 bsr tape_wait_p0 ; time +ve going wave | |
BDBD 2004 bra L_BDC3 | |
BDBF 0F82 tape_cmp_p0_1200 clr <$82 ; wavelength timer | |
BDC1 8DD6 bsr tape_wait_p1 ; time -ve going wave | |
BDC3 D682 L_BDC3 ldb <$82 ; wavelength timer | |
BDC5 D194 cmpb <$94 ; rejection threshold | |
BDC7 2203 bhi L_BDCC ; bad wave - clear counter | |
BDC9 D193 cmpb <$93 ; discrimination threshold | |
BDCB 39 rts | |
BDCC 0F83 L_BDCC clr <$83 ; phase lock counter | |
BDCE 39 rts | |
BDCF B6FF21 CASON lda >$ff21 ; * turn cassette relay on | |
BDD2 8A08 ora #$08 | |
BDD4 B7FF21 sta >$ff21 | |
BDD7 9E95 ldx <$95 | |
BDD9 16FDEC lbra delay_X | |
BDDC B6FF21 CASOFF lda >$ff21 ; * turn cassette relay off | |
BDDF 84F7 anda #$f7 | |
BDE1 B7FF21 sta >$ff21 | |
BDE4 1CAF andcc #$af | |
BDE6 39 rts | |
BDE7 1A50 CSRDON orcc #$50 ; mask interrupts | |
BDE9 8DE4 bsr CASON ; cassette relay on | |
BDEB 0F83 clr <$83 ; phase lock counter | |
BDED 8DA8 L_BDED bsr tape_wait_p0_p1 ; synchronise to in-phase wave (+ve then -ve) | |
BDEF 8DC8 L_BDEF bsr tape_cmp_p1_1200 ; test +ve wave | |
BDF1 220C bhi L_BDFF ; 0 or bad | |
BDF3 8DCA L_BDF3 bsr tape_cmp_p0_1200 ; test -ve wave | |
BDF5 250C bcs L_BE03 ; 1 or bad | |
BDF7 0C83 inc <$83 ; add 1 for each antiphase pair of cycles | |
BDF9 9683 lda <$83 | |
BDFB 8160 cmpa #$60 | |
BDFD 200E bra L_BE0D | |
BDFF 8DBE L_BDFF bsr tape_cmp_p0_1200 ; test -ve wave | |
BE01 22EC bhi L_BDEF ; 0 or bad | |
BE03 8DB4 L_BE03 bsr tape_cmp_p1_1200 ; test +ve wave | |
BE05 25EC bcs L_BDF3 ; 1 or bad | |
BE07 0A83 dec <$83 ; subtract 1 for each in-phase pair of cycles | |
BE09 9683 lda <$83 | |
BE0B 8B60 adda #$60 ; SUBA #-$60 | |
BE0D 26DE L_BE0D bne L_BDED ; need $60 locks in a row ($18 leader bytes) | |
BE0F 9784 sta <$84 ; phase flag | |
BE11 39 rts | |
BE12 3402 CBOUT pshs a ; * write byte out to tape (A) | |
BE14 C601 ldb #$01 ; send LSB first | |
BE16 108EBE44 L_BE16 ldy #cas_wav ; wave table | |
BE1A 9685 lda <$85 ; inter-wave level | |
BE1C B7FF20 sta >$ff20 | |
BE1F E5E4 bitb ,s | |
BE21 260D bne L_BE30 ; high frequency for 1 | |
BE23 A6A0 L_BE23 lda ,y+ ; low frequency for 0 | |
BE25 108CBE68 cmpy #WRTLDR | |
BE29 2412 bcc L_BE3D ; done 0 | |
BE2B B7FF20 sta >$ff20 | |
BE2E 20F3 bra L_BE23 | |
BE30 A6A1 L_BE30 lda ,y++ | |
BE32 108CBE68 cmpy #WRTLDR | |
BE36 2405 bcc L_BE3D ; done 1 | |
BE38 B7FF20 sta >$ff20 | |
BE3B 20F3 bra L_BE30 | |
BE3D 9785 L_BE3D sta <$85 ; inter-wave level | |
BE3F 58 lslb | |
BE40 24D4 bcc L_BE16 ; do next bit | |
BE42 3582 puls a,pc | |
BE44 8090A8B8C8D8E8F0F8F8F8F0E8D8C8B8 cas_wav fcb $80,$90,$a8,$b8,$c8,$d8,$e8,$f0,$f8,$f8,$f8,$f0,$e8,$d8,$c8,$b8 ; * wave table for cassette output | |
BE54 A8907868504030201008000000081020 fcb $a8,$90,$78,$68,$50,$40,$30,$20,$10,$08,$00,$00,$00,$08,$10,$20 | |
BE64 30405068 fcb $30,$40,$50,$68 | |
BE68 3424 WRTLDR pshs b,y ; * write leader to tape | |
BE6A 1A50 orcc #$50 ; mask interrupts | |
BE6C 17FF60 lbsr CASON ; cassette relay on | |
BE6F 8655 lda #$55 | |
BE71 9E90 ldx <$90 ; cassette leader byte count | |
BE73 8D9D L_BE73 bsr CBOUT ; write byte out to tape | |
BE75 301F leax -1,x | |
BE77 26FA bne L_BE73 ; do next byte | |
BE79 35A4 puls b,y,pc | |
BE7B 3405 SERIN pshs cc,b ; * read character from serial port into A | |
BE7D 1A50 orcc #$50 ; mask interrupts | |
BE7F 8608 lda #$08 | |
BE81 F6FF06 ldb >$ff06 | |
BE84 CA01 orb #$01 | |
BE86 F7FF06 stb >$ff06 ; set DTR | |
BE89 C4FE andb #$fe | |
BE8B B5FF05 L_BE8B bita >$ff05 ; wait until RX full | |
BE8E 27FB beq L_BE8B | |
BE90 F7FF06 stb >$ff06 ; clear DTR | |
BE93 B6FF04 lda >$ff04 | |
BE96 3585 puls cc,b,pc | |
BE98 3405 SEROUT pshs cc,b ; * write character to serial port (A) | |
BE9A C610 ldb #$10 | |
BE9C F5FF05 L_BE9C bitb >$ff05 ; wait until TX ready | |
BE9F 27FB beq L_BE9C | |
BEA1 B7FF04 sta >$ff04 | |
BEA4 3585 puls cc,b,pc | |
BEA6 C107 SERSET cmpb #$07 ; * (parameter in B is as per DLOAD) | |
BEA8 2412 bcc L_BEBC ; B must be 0 - 6 | |
BEAA 8EBEBE ldx #acia_baud_table ; serial baud setup table | |
BEAD 3A abx | |
BEAE F6FF07 ldb >$ff07 | |
BEB1 C4F0 andb #$f0 | |
BEB3 EA84 orb ,x | |
BEB5 F7FF07 stb >$ff07 | |
BEB8 1CFE andcc #$fe | |
BEBA 2001 bra L_BEBD | |
BEBC 53 L_BEBC comb | |
BEBD 39 L_BEBD rts | |
BEBE 030607080A0C0E acia_baud_table fcb $03,$06,$07,$08,$0a,$0c,$0e ; * serial port baud setup table | |
BEC5 2614 L_BEC5 bne L_BEDB ; * printer direct out (continued from $BCF5) | |
BEC7 F6FF22 L_BEC7 ldb >$ff22 | |
BECA 56 rorb | |
BECB 25FA bcs L_BEC7 ; printer busy | |
BECD 7FFF02 L_BECD clr >$ff02 | |
BED0 F6FF00 ldb >$ff00 | |
BED3 CA80 orb #$80 | |
BED5 5C incb | |
BED6 26F5 bne L_BECD ; wait until keys released | |
BED8 7EBCFD jmp L_BCFD | |
BEDB 3504 L_BEDB puls b | |
BEDD 7EBE98 jmp SEROUT ; send character to serial port | |
BEE0 F60151 L_BEE0 ldb >$0151 ; * scan keyboard continued | |
BEE3 5C incb | |
BEE4 2603 bne L_BEE9 ; key pressed | |
BEE6 F7011D stb >$011d ; stores a zero | |
BEE9 4D L_BEE9 tsta | |
BEEA 2711 beq L_BEFD ; ASCII NUL | |
BEEC F6011F ldb >$011f ; repeat delay | |
BEEF B1011D cmpa >$011d ; current key | |
BEF2 2703 beq L_BEF7 ; same key pressed - use normal repeat rate | |
BEF4 58 lslb | |
BEF5 58 lslb ; set up initial repeat delay | |
BEF6 58 lslb | |
BEF7 F7011E L_BEF7 stb >$011e ; repeat counter | |
BEFA B7011D sta >$011d ; current key | |
BEFD 3594 L_BEFD puls b,x,pc | |
BEFF 7F03FF L_BEFF clr >$03ff ; printer type flag | |
BF02 7F03FD clr >$03fd ; serial printer EOL delay | |
BF05 7F03FE clr >$03fe | |
BF08 CE0148 ldu #$0148 | |
BF0B 39 rts | |
BF0C 5A L_BF0C decb ; * send printer EOL characters (continued) | |
BF0D 2703 beq L_BF12 | |
BF0F 7EBD0F jmp L_BD0F | |
BF12 10BE03FD L_BF12 ldy >$03fd ; EOL delay | |
BF16 2707 beq L_BF1F | |
BF18 BDBBC5 L_BF18 jsr delay_1ms ; 10ms delay | |
BF1B 313F leay -1,y | |
BF1D 26F9 bne L_BF18 | |
BF1F 39 L_BF1F rts | |
BF20 F6FF05 ldb >$ff05 ; * (gives autorepeat keys) | |
BF23 2A0D bpl L_BF32 ; not serial interrupt | |
BF25 C408 andb #$08 | |
BF27 2708 beq L_BF31 ; RX not full | |
BF29 B6FF06 lda >$ff06 | |
BF2C 84FE anda #$fe | |
BF2E B7FF06 sta >$ff06 ; set DTR low | |
BF31 3B L_BF31 rti | |
BF32 740151 L_BF32 lsr >$0151 ; force complete keyboard read | |
BF35 7A011E dec >$011e ; key repeat counter | |
BF38 260C bne L_BF46 ; not yet... | |
BF3A 86FF lda #$ff ; clear key rollover table | |
BF3C 8E0151 ldx #$0151 | |
BF3F A780 L_BF3F sta ,x+ | |
BF41 8C015A cmpx #$015a | |
BF44 25F9 bcs L_BF3F | |
BF46 7E9D3D L_BF46 jmp IRQ_service ; resume with normal IRQ routine | |
BF49 12 BOOT64K nop ; * (doubles as 64K BASIC soft reset) | |
BF4A 1A50 orcc #$50 ; mask interrupts | |
BF4C 8EBF5A ldx #bootcode_64k | |
BF4F CE01DA ldu #$01da ; IO buffer | |
BF52 C68F ldb #$8f | |
BF54 17FC40 lbsr L_BB97 ; copy B bytes from X to U | |
BF57 7E01DA jmp >$01da ; IO buffer | |
BF5A B6011A bootcode_64k lda >$011a ; 64K BASIC flag | |
BF5D 8155 cmpa #$55 | |
BF5F 2616 bne L_BF77 | |
BF61 B7FFDF sta >$ffdf | |
BF64 8EC000 ldx #$c000 | |
BF67 CC0000 ldd #$0000 | |
BF6A E381 L_BF6A addd ,x++ | |
BF6C 8CFF00 cmpx #$ff00 | |
BF6F 25F9 bcs L_BF6A | |
BF71 10B3011B cmpd >$011b ; 64K BASIC checksum | |
BF75 276F beq L_BFE6 | |
BF77 B7FFDE L_BF77 sta >$ffde | |
BF7A B6FF23 lda >$ff23 | |
BF7D 84FB anda #$fb | |
BF7F B7FF23 sta >$ff23 | |
BF82 F6FF22 ldb >$ff22 | |
BF85 CA04 orb #$04 | |
BF87 F7FF22 stb >$ff22 | |
BF8A 8A04 ora #$04 | |
BF8C B7FF23 sta >$ff23 | |
BF8F B6FF22 lda >$ff22 | |
BF92 84FB anda #$fb | |
BF94 B7FF22 sta >$ff22 | |
BF97 FEBFF0 ldu cpu_vectors | |
BF9A 11833634 cmpu #$3634 | |
BF9E 2708 beq L_BFA8 | |
BFA0 8A04 ora #$04 | |
BFA2 B7FF22 sta >$ff22 | |
BFA5 7E8B8D jmp FC_error ; ?FC ERROR | |
BFA8 7F011B L_BFA8 clr >$011b ; 64K BASIC checksum | |
BFAB 7F011C clr >$011c | |
BFAE 8E8000 ldx #call_HWINIT | |
BFB1 108EC000 ldy #$c000 | |
BFB5 EC81 L_BFB5 ldd ,x++ | |
BFB7 B7FFDF sta >$ffdf | |
BFBA EDA1 std ,y++ | |
BFBC F3011B addd >$011b ; 64K BASIC checksum | |
BFBF FD011B std >$011b | |
BFC2 108CFF00 cmpy #$ff00 | |
BFC6 2405 bcc L_BFCD | |
BFC8 B7FFDE sta >$ffde | |
BFCB 20E8 bra L_BFB5 | |
BFCD 8EBFF0 L_BFCD ldx #cpu_vectors | |
BFD0 9F74 stx <$74 ; top of RAM | |
BFD2 9F27 stx <$27 ; top of BASIC RAM | |
BFD4 9F23 stx <$23 ; top of free string space | |
BFD6 3089FF38 leax >$ff38,x | |
BFDA 9F21 stx <$21 ; stack root / string storage start | |
BFDC 1F14 tfr x,s | |
BFDE 8EBF49 ldx #BOOT64K | |
BFE1 9F72 stx <$72 ; soft reset vector | |
BFE3 7EC000 jmp >$c000 | |
BFE6 7EC003 L_BFE6 jmp >$c003 | |
BFE9 00000000000000 fcb $00,$00,$00,$00,$00,$00,$00 | |
BFF0 org $bff0 | |
BFF0 000001000103010F010C01060109B3B4 cpu_vectors fdb $0000,$0100,$0103,$010f,$010c,$0106,$0109,RESET_service | |
C002 L_C002 equ $c002 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment