View Single Post
  #1  
Old 01-30-2008, 07:16 AM
Grant Stockly Grant Stockly is offline
Administrator
 
Join Date: Jan 2005
Posts: 447
Default 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
Reply With Quote