; Nam Prom Monitor ; edited Herb Johnson July 2020 from deramp.com file ;** ;**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