; - Power-Up RESET Entry
FD16 LDX #$FF ; Load X $FF
FD18 SEI ; Disable Interrupts
FD19 TXS ; Transfer $FF to Stack Pointer
FD1A CLD ; Clear Decimal Mode
FD1B JSR $E000 ; cint Initialize Editor & Screen
FD1E LDA #$FF
FD20 STA $94 ; Vector: Non-Maskable Interrupt [3:C389,4: B3FF]
FD22 LDA #$B3
FD24 STA $95
FD26 LDA #$78
FD28 STA $92 ; Vector: BRK Instr. Interrupt [3: FD17, 4: D478]
FD2A LDA #$D4
FD2C STA $93
FD2E LDA #$A4
FD30 STA $03FA ; Monitor extension vector [D7A4]
FD33 LDA #$D7
FD35 STA $03FB
FD38 LDA #$00
FD3A STA $03FC ; 4: Flag: Kernal Variable for IEEE Timeout
FD3D CLI ; Enable Interrupts
;
FD3E LDA $E810 ; PIA 1 CHIP - Check for Diagnostics line low
FD41 BMI $FD46 ;If MSB Set, go to BASIC RAM INIT (normal)
FD43 JMP $D472 ;If MSB of User Port Grounded go to Perform [ML monitor]
;
FD46 iFD46 JMP $D3B6 ; initcz Initialize BASIC RAM
; cint Initialize Editor & Screen
E000 iE000 JMP $E04B ; Start of Editor ROM
;
;cint1
E04B iE04B JSR $E60F ; cint1 => Initialize I/O ;Init PIAs & VIA and do a Power-up BEEP in BASIC4
E04E JSR $E07A ; Initialize CRTC --
; - After the CRTC is initialized, Clear the Screen
E051 iE051 LDX $E0 ; 3+4.40: Screen Line Link Table / Editor Temps
E053 DEX
E054 iE054 INX
E055 JSR $E06C
E058 JSR $E1C1 ; - Clear Screen Line
E05B CPX $E1 ; 4.80: last line of window
E05D BCC $E054
E05F iE05F LDX $E0 ; 3+4.40: Screen Line Link Table / Editor Temps
E061 STX $D8 ; Current Cursor Physical Line Number
E063 iE063 LDY $E2 ; 4.80: first column of window
E065 STY $C6 ; Cursor Column on Current Line
; - Set Screen Pointers
E067 iE067 LDX $D8 ; Current Cursor Physical Line Number
E069 JMP $E06F
E06C iE06C LDY $E2 ; 4.80: first column of window
E06E DEY
E06F iE06F LDA $E755,X ; - Screen Line Addresses LO DATA
E072 STA $C4 ; Pointer: Current Screen Line Address
E074 LDA $E76E,X ; - Screen Line Addresses HI DATA
E077 STA $C5
E079 RTS
; Initialize CRTC --
E07A iE07A LDA #$2A
E07C LDX #$E7
E07E LDY #$0E
E080 BNE $E088
; Initialize CRTC --
E082 iE082 LDA #$3C ;E73C has video setup data constants
E084 LDX #$E7
E086 LDY #$0C
E088 iE088 STA $C7 ; Pointer: Tape Buffer/ Screen Scrolling
E08A STX $C8
E08C LDA $E84C
E08F AND #$F0
E091 STA $D1 ; Length of Current File Name
E093 TYA
E094 ORA $D1 ; Length of Current File Name
E096 STA $E84C
E099 LDY #$11
E09B iE09B LDA ($C7),Y ; Pointer: Tape Buffer/ Screen Scrolling
E09D STY $E880 ; 6545/6845 CRT CHIP
E0A0 STA $E881
E0A3 DEY
E0A4 BPL $E09B
E0A6 RTS
;
; initcz Initialize BASIC RAM - MAIN INIT
;
D3B6 iD3B6 LDX #$FB
D3B8 TXS ;transfer X to Stack Pointer to init
D3B9 LDA #$4C
D3BB STA $51
D3BD STA $00 ; USR Function Jump Instr (4C)
D3BF LDA #$73
D3C1 LDY #$C3
D3C3 STA $01 ; USR Address [4: C373]
D3C5 STY $02
D3C7 LDX #$1C
D3C9 iD3C9 LDA $D398,X ; load constants in 6F
D3CC STA $6F,X
D3CE DEX
D3CF BNE $D3C9
D3D1 LDA #$03
D3D3 STA $50
D3D5 TXA ; Transfer X register to ACC should have zero
D3D6 STA $65 ; Floating -accum. #1: Overflow Digit
D3D8 STA $10 ; 3: width of source (unused - from TTY)
D3DA STA $15
D3DC STA $0D ; 3: Flag to suppress PRINT or PRINT# when -ve
D3DE PHA ; push ACC to stack s/b zero
D3DF INX ; increment x register
D3E0 STX $01FD ; store X to 01FD
D3E3 STX $01FC ; store X to 01FC
D3E6 LDX #$16 ; load X with 16
D3E8 STX $13 ; Pointer Temporary String
D3EA LDY #$04 ; Initialize Y register to 04 as hi byte address
D3EC STA $28 ; Pointer: Start of BASIC Text [0401]
D3EE STY $29
D3F0 STA $11 ; Temp: Integer Value start at 00
D3F2 STY $12 ;starts at 04
D3F4 TAY ;transfer acc to Y register (clear)
D3F5 LDA #$80
D3F7 BNE $D400 ;always go to Memory Test at $D400
D3F9 LDA #$00
D3FB LDY #$B0
D3FD JMP $D41B
;
;Memory Test
;
D400 iD400 INC $11 ; Start Memory test loop by increment of low byte address from init address $0400
D402 BNE $D408 ; If not zero, continue to D408
D404 INC $12 ; If zero, bump high byte address which was initialized to 04
D406 BMI $D417 ; Branch when hi byte hits $80 (32K) to initms Output Power-Up Message
D408 iD408 LDA #$55 ; Load $55 test pattern into ACC
D40A STA ($11),Y ; Store test pattern into memory indirectly addressed by location 11 & 12
; Y register will always stay at zero in this loop
D40C CMP ($11),Y ; Compare Memory contents with ACC
D40E BNE $D417 ; If not equal, branch to 'Output Power-Up Message' with current RAM address in 11 & 12
D410 ASL ; Shift ACC left to get $AA test pattern
D411 STA ($11),Y ; Store test pattern into memory indirectly addressed by location 11 & 12
D413 CMP ($11),Y ; Compare Memory contents with ACC
D415 BEQ $D400 ; If Pass, go back to start of memory test loop to increment address
; If Fail, drop to initms with current RAM address in memory location 11 & 12
;
; initms Output Power-Up Message
;
D417 iD417 LDA $11 ; Load Low Byte Memory Count
D419 LDY $12 ; Load High Byte Memory Count
D41B iD41B STA $34 ; Pointer: Highest Address Used by BASIC
D41D STY $35
D41F STA $30 ; Pointer: Bottom of String Storage
D421 STY $31
D423 LDY #$00
D425 TYA ; Clear ACC
D426 STA ($28),Y ; Pointer: Start of BASIC Text [0401]
D428 INC $28 ; Pointer: Start of BASIC Text [0401]
D42A LDA #$A4
D42C LDY #$DE
D42E JSR $BB1D ; strout Output String ###COMMODORE BASIC 4###
D431 LDA $34 ; Pointer: Highest Address Used by BASIC
D433 SEC
D434 SBC $28 ; Pointer: Start of BASIC Text [0401]
D436 TAX
D437 LDA $35
D439 SBC $29
D43B JSR $CF83 ;calc free memory and print on screen???
D43E LDA #$4B
D440 LDY #$D4
D442 JSR $BB1D ; strout Output String "bytes free"
D445 JSR $B5D4
D448 JMP $B3FF ; ready Restart BASIC
; words Power-Up Message for old PET not used DATA
D44B .byte 20 42 59 54 45 53 20 46 ; bytes f
D453 .byte 52 45 45 0D 00 23 23 23 ;ree..###
D45B .byte 20 43 4F 4D 4D 4F 44 4F ; commodo
D463 .byte 52 45 20 42 41 53 49 43 ;re basic
D46B .byte 20 23 23 23 0D 0D 00 ; ###...
;
; Perform [monitor]
;
D472 iD472 LDA #$43
D474 STA $B5
D476 BNE $D491
; Break Entry
D478 JSR $F2A6 ; clrchn Restore Default I/O
D47B LDA #$42
D47D STA $B5
D47F CLD
D480 LSR
D481 PLA
D482 STA $0205
D485 PLA
D486 STA $0204
D489 PLA
D48A STA $0203
D48D PLA
D48E STA $0202
D491 iD491 PLA
D492 ADC #$FF
D494 STA $0201
D497 PLA
D498 ADC #$FF
D49A STA $0200 ; System INPUT Buffer
D49D LDA $90 ; Vector: Hardware Interrupt [3: E62E, 4: E455]
D49F STA $0208
D4A2 LDA $91
D4A4 STA $0207
D4A7 TSX
D4A8 STX $0206
D4AB CLI
D4AC JSR $D534 ; New Line
D4AF LDX $B5
D4B1 LDA #$2A
D4B3 JSR $D731 ; Output 2 Ascii Chars
D4B6 LDA #$52
D4B8 BNE $D4D4
; *Get Command
D4BA iD4BA LDA #$02
D4BC STA $77 ; Pointer: Current Byte of BASIC Text
D4BE LDA #$00
D4C0 STA $DE ; Cassette Read / Write Block Count
D4C2 LDX #$0D
D4C4 LDA #$2E
D4C6 JSR $D731 ; Output 2 Ascii Chars
D4C9 iD4C9 JSR $D798 ; ?
D4CC CMP #$2E
D4CE BEQ $D4C9
D4D0 CMP #$20
D4D2 BEQ $D4C9
D4D4 iD4D4 LDX #$07
D4D6 iD4D6 CMP $D544,X ; Commands DATA
D4D9 BNE $D4E6
D4DB STX $B4
D4DD LDA $D54C,X ; Command Vectors DATA
D4E0 PHA
D4E1 LDA $D554,X
D4E4 PHA
D4E5 RTS
D4E6 iD4E6 DEX
D4E7 BPL $D4D6
D4E9 JMP ($03FA) ; Monitor extension vector [D7A4]
D4EC iD4EC LDA $FB ; I/O Start Address
D4EE STA $0201
D4F1 LDA $FC
D4F3 STA $0200 ; System INPUT Buffer
D4F6 RTS
; Display Memory
D4F7 iD4F7 STA $B5
D4F9 LDY #$00
D4FB iD4FB JSR $D531 ; Print Space
D4FE LDA ($FB),Y ; I/O Start Address
D500 JSR $D722 ; Output 2-digit Byte
D503 JSR $D539 ; Increment Pointer
D506 DEC $B5
D508 BNE $D4FB
D50A RTS
; ?
D50B iD50B JSR $D763 ; Input Hex Byte
D50E BCC $D51D
D510 LDX #$00
D512 STA ($FB,X) ; I/O Start Address
D514 CMP ($FB,X) ; I/O Start Address
D516 BEQ $D51D
D518 PLA
D519 PLA
D51A JMP $D7A4 ; Print '?'
D51D iD51D JSR $D539 ; Increment Pointer
D520 DEC $B5
D522 RTS
; ?
D523 iD523 LDA #$02
D525 STA $FB ; I/O Start Address
D527 LDA #$02
D529 STA $FC
D52B LDA #$05
D52D RTS
D52E iD52E JSR $D531 ; Print Space
; Print Space
D531 iD531 LDA #$20
D533 BIT $0DA9
; *** Resyncing ***
; New Line
D534 iD534 LDA #$0D
D536 JMP $F266 ; chrout Output One Character
; Increment Pointer
D539 iD539 INC $FB ; I/O Start Address
D53B BNE $D543
D53D INC $FC
D53F BNE $D543
D541 INC $DE ; Cassette Read / Write Block Count
D543 iD543 RTS
; Commands DATA
D544 sD544 .byte 3A 3B 52 4D 47 58 4C 53 ;:;rmgxls
; Command Vectors DATA
D54C sD54C .byte D6 D5 D5 D5 D6 D6 D6 D6 ;VUUUVVVV
D554 sD554 .byte 1C FA 86 BB 32 6A 74 74 ;....2JTT
; '<cr> pc irq sr ac xr yr sp' DATA
D55C sD55C .byte 0D 20 20 20 20 20 50 43 ;. pc
D564 .byte 20 20 49 52 51 20 20 53 ; irq s
D56C .byte 52 20 41 43 20 58 52 20 ;r ac xr
D574 .byte 59 52 20 53 50 ;yr sp
; Do New Line
D579 iD579 TYA
D57A PHA
D57B JSR $D534 ; New Line
D57E PLA
D57F LDX #$2E
D581 JSR $D731 ; Output 2 Ascii Chars
D584 JMP $D52E
; Perform [r]
D587 LDX #$00
D589 iD589 LDA $D55C,X ; '<cr> pc irq sr ac xr yr sp' DATA
D58C JSR $F266 ; chrout Output One Character
D58F INX
D590 CPX #$1D
D592 BNE $D589
D594 LDY #$3B
D596 JSR $D579 ; Do New Line
D599 LDA $0200 ; System INPUT Buffer
D59C JSR $D722 ; Output 2-digit Byte
D59F LDA $0201
D5A2 JSR $D722 ; Output 2-digit Byte
D5A5 JSR $D531 ; Print Space
D5A8 LDA $0207
D5AB JSR $D722 ; Output 2-digit Byte
D5AE LDA $0208
D5B1 JSR $D722 ; Output 2-digit Byte
D5B4 JSR $D523 ; ?
D5B7 JSR $D4F7 ; Display Memory
D5BA BEQ $D5F5
; Perform [m]
D5BC JSR $D798 ; ?
D5BF JSR $D754 ; ?
D5C2 BCC $D5F8
D5C4 JSR $D744 ; Swap Add_ with Add_
D5C7 JSR $D798 ; ?
D5CA JSR $D754 ; ?
D5CD BCC $D5F8
D5CF JSR $D744 ; Swap Add_ with Add_
D5D2 iD5D2 JSR $F335 ; - -stop-
D5D5 BEQ $D5F5
D5D7 LDX $DE ; Cassette Read / Write Block Count
D5D9 BNE $D5F5
D5DB SEC
D5DC LDA $FD ; Tape Load Temps
D5DE SBC $FB ; I/O Start Address
D5E0 LDA $FE
D5E2 SBC $FC
D5E4 BCC $D5F5
D5E6 LDY #$3A
D5E8 JSR $D579 ; Do New Line
D5EB JSR $D717 ; Output 4-digit Address
D5EE LDA #$08
D5F0 JSR $D4F7 ; Display Memory
D5F3 BEQ $D5D2
D5F5 iD5F5 JMP $D4BA ; *Get Command
D5F8 iD5F8 JMP $D7A4 ; Print '?'
; Perform [;]
D5FB JSR $D763 ; Input Hex Byte
D5FE JSR $D754 ; ?
D601 BCC $D606
D603 JSR $D4EC
D606 iD606 JSR $F215 ; chrin Input a byte
D609 JSR $D754 ; ?
D60C BCC $D618
D60E LDA $FB ; I/O Start Address
D610 STA $0208
D613 LDA $FC
D615 STA $0207
D618 iD618 JSR $D523 ; ?
D61B BNE $D627
; Perform [:]
D61D JSR $D763 ; Input Hex Byte
D620 JSR $D754 ; ?
D623 BCC $D5F8
D625 LDA #$08
D627 iD627 STA $B5
D629 iD629 JSR $D798 ; ?
D62C JSR $D50B ; ?
D62F BNE $D629
D631 BEQ $D5F5
; Perform [g]
D633 JSR $F215 ; chrin Input a byte
D636 CMP #$0D
D638 BEQ $D646
D63A CMP #$20
D63C BNE $D5F8
D63E JSR $D754 ; ?
D641 BCC $D646
D643 JSR $D4EC
D646 iD646 LDX $0206
D649 TXS
D64A SEI
D64B LDA $0207
D64E STA $91
D650 LDA $0208
D653 STA $90 ; Vector: Hardware Interrupt [3: E62E, 4: E455]
D655 LDA $0200 ; System INPUT Buffer
D658 PHA
D659 LDA $0201
D65C PHA
D65D LDA $0202
D660 PHA
D661 LDA $0203
D664 LDX $0204
D667 LDY $0205
D66A RTI
; Perform [x]
D66B LDX $0206
D66E TXS
D66F JMP $B3FF ; ready Restart BASIC
========================================================
========================================================
;Initialize I/O
; cint1 Initialize I/O
E60F iE60F LDA #$7F
E611 STA $E84E
E614 LDX #$6D
E616 LDA #$00
E618 STA $E8 ; 4.80: Home Count
E61A STA $E4 ; 4.80: Flag: REPEAT Key Used, $80 = Repeat, $40 = disable
E61C iE61C STA $8D,X ; Real-Time Jiffy Clock (approx) 1/60 Sec
E61E DEX
E61F BPL $E61C
E621 LDA #$55
E623 STA $90 ; Vector: Hardware Interrupt [3: E62E, 4: E455]
E625 LDA #$E4
E627 STA $91
E629 LDA #$09
E62B STA $E3 ; 4.80: Size of Keyboard Buffer
E62D LDA #$03
E62F STA $B0 ; Default Output (CMD) Device (3)
E631 LDA #$0F
E633 STA $E810 ; PIA 1 CHIP
E636 ASL
E637 STA $E840 ; VIA CHIP
E63A STA $E842
E63D STX $E822
E640 STX $E845
E643 LDA #$3D
E645 STA $E813
E648 BIT $E812
E64B LDA #$3C
E64D STA $E821
E650 STA $E823
E653 STA $E811
E656 STX $E822
E659 LDA #$0E
E65B STA $A8 ; Timer: Countdown to Toggle Cursor
E65D STA $A7 ; Cursor Blink enable: 0 = Flash Cursor
E65F STA $E6 ; 4.80: Repeat Delay Counter
E661 STA $E5 ; 4.80: Repeat Speed Counter
E663 STA $E84E
E666 JSR $E1D2 ; Exit Window
E669 LDX #$0C
E66B LDA #$00
E66D iE66D STA $03EE,X ; 4.80: Table of 80 bits to set TABs
E670 DEX
E671 BPL $E66D
E673 LDA #$1D
E675 LDX #$E1
E677 STA $E9 ; 4.80: input from screen vector (from E006)
E679 STX $EA
E67B LDA #$0C
E67D LDX #$E2
E67F STA $EB ; 4.80: print to screen vector (from E009)
E681 STX $EC
E683 LDA #$10
E685 STA $E7 ; 4.80: Chime Time; Power up BEEP for 8032??
E687 JSR $E6A4
E68A BEQ $E6A4
E68C iE68C JSR $E202 ; - Output to Screen
E68F TAX
E690 LDA $D5 ; Physical Screen Line Length
E692 SEC
E693 SBC $C6 ; Cursor Column on Current Line
E695 CMP #$05
E697 BNE $E6D0
E699 TXA
E69A CMP #$1D
E69C BEQ $E6A4
E69E AND #$7F
E6A0 CMP #$20
E6A2 BCC $E6D0
E6A4 iE6A4 JSR $E6A7 ; ?
; ?
E6A7 iE6A7 LDY $E7 ; 4.80: Chime Time; Power up BEEP for 8032??
E6A9 BEQ $E6D0
E6AB LDA #$10
E6AD STA $E84B
E6B0 LDA #$0F
E6B2 STA $E84A
E6B5 LDX #$07
E6B7 iE6B7 LDA $E74D,X ; Timer 2 LO Values DATA
E6BA STA $E848
E6BD LDA $E7 ; 4.80: Chime Time; Power up BEEP for 8032??
E6BF iE6BF DEY
E6C0 BNE $E6BF
E6C2 SEC
E6C3 SBC #$01
E6C5 BNE $E6BF
E6C7 DEX
E6C8 BNE $E6B7
E6CA STX $E84A
E6CD STX $E84B
E6D0 sE6D0 RTS