Grant Stockly |
01-30-2008 07:16 AM |
Altair 680 Monitor ROM Source
Code:
Nam Prom Momitor
;**
;**altair 680b Prom Monitor
;**acia Version 1.0
;**
Mivec Equ $100
Nmivec Equ $104
Straps Equ $f002
Noterm Equ 0
Aciacs Equ $f000
Aciada Equ $f001
;**
;**monitor Stack And Flags
;**
Org $f1
Stack Rmb 1 ;bottom Of Monitor's Stack
Brkadr Rmb 1 ;breakpoint Address Flag
Echo Rmb 1 ;tty Echo Flag
Extflg Rmb 1 ;entended Character Flag
Bufull Rmb 1 ;buffer Full Flag
Savstk Rmb 2 ;temp For Stack Pointer
Temp Rmb 1 ;temporary Storage
Bytect Rmb 1 ;byte Count
Xhi Rmb 1 ;xreg High
Xlow Rmb 1 ;xreg Low
Shift Rmb 1 ;baudot Shift Flag
Savex Rmb 2 ;temp For Index Rg
Buffer Rmb 1 ;baudot Character Flag
;**
;* Start Of Prom
;**
Org $ff00
;**
;* Input One Char Into A-register
;* Echo Character If Bit 7 Of Echo Flag Is Clear
;**
Inch Bsr Polcat ;acia Statuc To A Reg
Bcc Inch ;receive Not Ready
Lda B, #$7f ;mask For Parity Removal
Cmp B, Echo ;check Echo Flag
And B, Aciada ;get Caracter
Bcc Outch ;echo
Rts ;no Echo
;**
;* The Following Nop Lines Lines Up The Entry
;* Points To Polcat In The Two Versions
;* Of The Monitor
;**
Nop
;**
;* Input One Hex Digit Into B Reg
;* Return To Calling Program If
;* Character Received Is A Hex
;* Digit. If Not Hex, Go To Crlf
;**
Inhex Bsr Inch ;get A Character
Sub B, #'0'
Bmi C1 ;not Hex
Cmp B, #$09
Ble In1hg ;not Hex
Cmp B, #$11
Bmi C1 ;not Hex
Cmp B, #$16
Bgt C1 ;not Hex
Sub B, #$07 ;it's A Letter-get Bcd
In1hg Rts ;return
;**
;* Pole For Character
;* Sets Carry If Character Is In Buffer
;* Clobbers 8 Reg
;**
Polcat Lda B, Aciacs ;acia Status T0 B
Asrb ;rotate Rdrf Bit Into Carry
Rts ;return
;**
;* Load Paper Tape
;* Load Only S1 Type Records
;* Terminate On S9 Or Checksum Error
;**
Load Bsr Inch ;read Frame
Sub B, #'s'
Bne Load ;first Char Not (s)
Bsr Inch ;read Frame
Cmp B, #'9'
Beq C1 ;s9 End Of File
Cmp B, #'1'
Bne Load ;second Char Not (1)
Clr A ;zero The Checksum
Bsr Byte ;read Byte
Sub B, #$02
Sta B, Bytect ;byte Count
Bsr Baddr ;get Address Of Block
Load11 Bsr Byte ;get Data Byte
Dec Bytect ;decrement Byte Count
Beq Load15 ;done With This Block
Sta B, 0, X ;store Data
Inx ;bump Pointer
Bra Load11 ;go Back For More
Load15 Inc A ;increment Checksum
Lload Beq Load ;all Ok - It's Zero
C1 Bra Crlf ;checksum Error - Quit
;**
;* Read Byte (2 Hex Digits)
;* Into B Reg
;* A Is Used For Paper Tape Checksum
;**
Byte Bsr Inhex ;get First Hex Dig
Asl B ;get Shift To High Order 4 Bits
Asl B
Asl B
Asl B
Aba ;add To Cheksum
Sta B, Temp ;store Digit
Bsr Inhex ;get 2nd Hex Dig
Aba ;add To Checksum
Add B, Temp ;combine Digits To Get Byte
Rts ;return
;**
;* Read 16 Bit Address Into X
;* Store Same Address In Xhi & Xlo
;* Clobbers B Reg
;**
Baddr Bsr Byte ;get High Order Address
Sta B, Xhi ;store It
Bsr Byte ;get Low Order Address
Sta B, Xlow ;store It
Ldx Xhi ;load X With Address Built
Rts ;return
;**
;* Print Byte In A Reg
;* Clobbers B Reg
;**
Out2h Tab ;copy Byte To B
Lsr B ;shift To Right
Lsr B
Lsr B
Lsr B
Bsr Outhr ;output First Digit
Tab ;byte Into B Again
Outhr And B, #$0f ;get Rid Of Left Dig
Add B, #$30 ;get Ascii
Cmp B, #$39
Bls Outch
Add B, #$07 ;if It's A Letter Add 7
Nop ;line Up Outch Entry Points
Nop
Outch Fcb $8c ;use Cpx Skip Trick
Outs Lda B, #$20 ;outs Prints A Space
;**
;* Outch Outputs Character In B
;**
Psh B ;save Char
Outc1 Bsr Polcat ;acia Status To B Reg
Asr B
Bcc Outc1 ;xmit Not Ready
Pul B ;char Back To B Reg
Sta B, Aciada ;output Character
Rts
;**
;* Examine And Deposit Next
;* Uses Contents Of Xhi & Xlo As Pointer
;**
Nchang Ldx Xhi ;increment Pointer
Inx
Stx Xhi
Lda A, Xhi
Bsr Out2h ;print Out Address
Lda A, Xlow
Bsr Out2h
Fcb $8c ;use Cpx Skip Trick
;**
;* Examine & Deposit
;**
Change Bsr Baddr ;build Address
Bsr Outs ;print Space
Lda A, 0, X ;byte Into A
Bsr Out2h ;print Byte
Bsr Outs ;print Space
Bsr Byte ;get New Byte
Sta B, 0, X ;store New Byte
;**
;* Command Decoding Section
;**
Crlf Lds Savstk
Lda B, #$0d ;carriage Return
Bsr Outch
Lda B, #$0a ;line Feed
Bsr Outch
Lda B, #'.' ;prompt Character
Bsr Outch
Jsr Inch ;read Character
Tba ;make A Copy
Bsr Outs ;print Space
Cmp A, #'l'
Beq Lload ;load Paper Tape
Cmp A, #'j'
Bne Notj
Bsr Baddr ;get Address To Jump To
Jmp 0, X ;jump To It
Notj Cmp A, #'m'
Beq Change ;examine & Deposit
Cmp A, #'n'
Beq Nchang ;e & D Next
Cmp A, #'p'
Bne Crlf
Rti ;procede From Breakpoint
;**
;* Reset Entry Point
;**
Reset Lds #echo ;initialize Stack Pointer
Lda B, #$03 ;init Echo And Brkadr Flags
Psh B
Psh B
Sta B, Aciacs ;master Reset Acia
Lda B, Straps ;look At Straps
Bmi Noterm ;no Term - Jump To 0
And B, #$04 ;get # Of Stop Bits
Ora B, #$d1
Sta B, Aciacs ;init Acia Port
;**
;* Software Interrupt Entry Point
;**
Intrpt Sts Savstk ;save Stack Pointer
Sts Xhi ;save Sp For N Command
Lda B, Brkadr ;if Bit 7 Of Brkadr Is Set
Bmi Noterm ;jump To 0
Bra Crlf ;goto Command Decoder
;**
;* Now Come The Interrupt Vectors
;**
Org $fff8
Fdb Mivec ;mi Vector
Fdb Intrpt ;swi Vector
Fdb Nmivec ;nmi Vector
Fdb Reset ;reset Vector
End
|