PDA

View Full Version : Altair 680 Monitor ROM Source


Grant Stockly
01-30-2008, 07:16 AM
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

Grant Stockly
01-30-2008, 07:20 AM
Assembled Listing
0 : =$100 MIVEC EQU $100
0 : =$104 NMIVEC EQU $104
0 : =$F002 STRAPS EQU $F002
0 : =$0 NOTERM EQU 0
0 : =$F000 ACIACS EQU $F000
0 : =$F001 ACIADA EQU $F001
0 : ;**
0 : ;**MONITOR STACK AND FLAGS
0 : ;**
F1 : ORG $F1
F1 : STACK RMB 1 ;BOTTOM OF MONITOR'S STACK
F2 : BRKADR RMB 1 ;BREAKPOINT ADDRESS FLAG
F3 : ECHO RMB 1 ;TTY ECHO FLAG
F4 : EXTFLG RMB 1 ;ENTENDED CHARACTER FLAG
F5 : BUFULL RMB 1 ;BUFFER FULL FLAG
F6 : SAVSTK RMB 2 ;TEMP FOR STACK POINTER
F8 : TEMP RMB 1 ;TEMPORARY STORAGE
F9 : BYTECT RMB 1 ;BYTE COUNT
FA : XHI RMB 1 ;XREG HIGH
FB : XLOW RMB 1 ;XREG LOW
FC : SHIFT RMB 1 ;BAUDOT SHIFT FLAG
FD : SAVEX RMB 2 ;TEMP FOR INDEX RG
FF : BUFFER RMB 1 ;BAUDOT CHARACTER FLAG
100 : ;**
100 : ;* START OF PROM
100 : ;**
FF00 : ORG $FF00
FF00 : ;**
FF00 : ;* INPUT ONE CHAR INTO A-REGISTER
FF00 : ;* ECHO CHARACTER IF BIT 7 OF ECHO FLAG IS CLEAR
FF00 : ;**
FF00 : 8D 22 INCH BSR POLCAT ;ACIA STATUC TO A REG
FF02 : 24 FC BCC INCH ;RECEIVE NOT READY
FF04 : C6 7F LDA B, #$7F ;MASK FOR PARITY REMOVAL
FF06 : D1 F3 CMP B, ECHO ;CHECK ECHO FLAG
FF08 : F4 F0 01 AND B, ACIADA ;GET CARACTER
FF0B : 24 74 BCC OUTCH ;ECHO
FF0D : 39 RTS ;NO ECHO
FF0E : ;**
FF0E : ;* THE FOLLOWING NOP LINES LINES UP THE ENTRY
FF0E : ;* POINTS TO POLCAT IN THE TWO VERSIONS
FF0E : ;* OF THE MONITOR
FF0E : ;**
FF0E : 01 NOP
FF0F : ;**
FF0F : ;* INPUT ONE HEX DIGIT INTO B REG
FF0F : ;* RETURN TO CALLING PROGRAM IF
FF0F : ;* CHARACTER RECEIVED IS A HEX
FF0F : ;* DIGIT. IF NOT HEX, GO TO CRLF
FF0F : ;**
FF0F : 8D EF INHEX BSR INCH ;GET A CHARACTER
FF11 : C0 30 SUB B, #'0'
FF13 : 2B 3C BMI C1 ;NOT HEX
FF15 : C1 09 CMP B, #$09
FF17 : 2F 0A BLE IN1HG ;NOT HEX
FF19 : C1 11 CMP B, #$11
FF1B : 2B 34 BMI C1 ;NOT HEX
FF1D : C1 16 CMP B, #$16
FF1F : 2E 30 BGT C1 ;NOT HEX
FF21 : C0 07 SUB B, #$07 ;IT'S A LETTER-GET BCD
FF23 : 39 IN1HG RTS ;RETURN
FF24 : ;**
FF24 : ;* POLE FOR CHARACTER
FF24 : ;* SETS CARRY IF CHARACTER IS IN BUFFER
FF24 : ;* CLOBBERS 8 REG
FF24 : ;**
FF24 : F6 F0 00 POLCAT LDA B, ACIACS ;ACIA STATUS T0 B
FF27 : 57 ASRB ;ROTATE RDRF BIT INTO CARRY
FF28 : 39 RTS ;RETURN
FF29 : ;**
FF29 : ;* LOAD PAPER TAPE
FF29 : ;* LOAD ONLY S1 TYPE RECORDS
FF29 : ;* TERMINATE ON S9 OR CHECKSUM ERROR
FF29 : ;**
FF29 : 8D D5 LOAD BSR INCH ;READ FRAME
FF2B : C0 53 SUB B, #'S'
FF2D : 26 FA BNE LOAD ;FIRST CHAR NOT (S)
FF2F : 8D CF BSR INCH ;READ FRAME
FF31 : C1 39 CMP B, #'9'
FF33 : 27 1C BEQ C1 ;S9 END OF FILE
FF35 : C1 31 CMP B, #'1'
FF37 : 26 F0 BNE LOAD ;SECOND CHAR NOT (1)
FF39 : 4F CLR A ;ZERO THE CHECKSUM
FF3A : 8D 17 BSR BYTE ;READ BYTE
FF3C : C0 02 SUB B, #$02
FF3E : D7 F9 STA B, BYTECT ;BYTE COUNT
FF40 : 8D 20 BSR BADDR ;GET ADDRESS OF BLOCK
FF42 : 8D 0F LOAD11 BSR BYTE ;GET DATA BYTE
FF44 : 7A 00 F9 DEC BYTECT ;DECREMENT BYTE COUNT
FF47 : 27 05 BEQ LOAD15 ;DONE WITH THIS BLOCK
FF49 : E7 00 STA B, 0, X ;STORE DATA
FF4B : 08 INX ;BUMP POINTER
FF4C : 20 F4 BRA LOAD11 ;GO BACK FOR MORE
FF4E : 4C LOAD15 INC A ;INCREMENT CHECKSUM
FF4F : 27 D8 LLOAD BEQ LOAD ;ALL OK - IT'S ZERO
FF51 : 20 58 C1 BRA CRLF ;CHECKSUM ERROR - QUIT
FF53 : ;**
FF53 : ;* READ BYTE (2 HEX DIGITS)
FF53 : ;* INTO B REG
FF53 : ;* A IS USED FOR PAPER TAPE CHECKSUM
FF53 : ;**
FF53 : 8D BA BYTE BSR INHEX ;GET FIRST HEX DIG
FF55 : 58 ASL B ;GET SHIFT TO HIGH ORDER 4 BITS
FF56 : 58 ASL B
FF57 : 58 ASL B
FF58 : 58 ASL B
FF59 : 1B ABA ;ADD TO CHEKSUM
FF5A : D7 F8 STA B, TEMP ;STORE DIGIT
FF5C : 8D B1 BSR INHEX ;GET 2ND HEX DIG
FF5E : 1B ABA ;ADD TO CHECKSUM
FF5F : DB F8 ADD B, TEMP ;COMBINE DIGITS TO GET BYTE
FF61 : 39 RTS ;RETURN
FF62 : ;**
FF62 : ;* READ 16 BIT ADDRESS INTO X
FF62 : ;* STORE SAME ADDRESS IN XHI & XLO
FF62 : ;* CLOBBERS B REG
FF62 : ;**
FF62 : 8D EF BADDR BSR BYTE ;GET HIGH ORDER ADDRESS
FF64 : D7 FA STA B, XHI ;STORE IT
FF66 : 8D EB BSR BYTE ;GET LOW ORDER ADDRESS
FF68 : D7 FB STA B, XLOW ;STORE IT
FF6A : DE FA LDX XHI ;LOAD X WITH ADDRESS BUILT
FF6C : 39 RTS ;RETURN
FF6D : ;**
FF6D : ;* PRINT BYTE IN A REG
FF6D : ;* CLOBBERS B REG
FF6D : ;**
FF6D : 16 OUT2H TAB ;COPY BYTE TO B
FF6E : 54 LSR B ;SHIFT TO RIGHT
FF6F : 54 LSR B
FF70 : 54 LSR B
FF71 : 54 LSR B
FF72 : 8D 01 BSR OUTHR ;OUTPUT FIRST DIGIT
FF74 : 16 TAB ;BYTE INTO B AGAIN
FF75 : C4 0F OUTHR AND B, #$0F ;GET RID OF LEFT DIG
FF77 : CB 30 ADD B, #$30 ;GET ASCII
FF79 : C1 39 CMP B, #$39
FF7B : 23 04 BLS OUTCH
FF7D : CB 07 ADD B, #$07 ;IF IT'S A LETTER ADD 7
FF7F : 01 NOP ;LINE UP OUTCH ENTRY POINTS
FF80 : 01 NOP
FF81 : 8C OUTCH FCB $8C ;USE CPX SKIP TRICK
FF82 : C6 20 OUTS LDA B, #$20 ;OUTS PRINTS A SPACE
FF84 : ;**
FF84 : ;* OUTCH OUTPUTS CHARACTER IN B
FF84 : ;**
FF84 : 37 PSH B ;SAVE CHAR
FF85 : 8D 9D OUTC1 BSR POLCAT ;ACIA STATUS TO B REG
FF87 : 57 ASR B
FF88 : 24 FB BCC OUTC1 ;XMIT NOT READY
FF8A : 33 PUL B ;CHAR BACK TO B REG
FF8B : F7 F0 01 STA B, ACIADA ;OUTPUT CHARACTER
FF8E : 39 RTS
FF8F : ;**
FF8F : ;* EXAMINE AND DEPOSIT NEXT
FF8F : ;* USES CONTENTS OF XHI & XLO AS POINTER
FF8F : ;**
FF8F : DE FA NCHANG LDX XHI ;INCREMENT POINTER
FF91 : 08 INX
FF92 : DF FA STX XHI
FF94 : 96 FA LDA A, XHI
FF96 : 8D D5 BSR OUT2H ;PRINT OUT ADDRESS
FF98 : 96 FB LDA A, XLOW
FF9A : 8D D1 BSR OUT2H
FF9C : 8C FCB $8C ;USE CPX SKIP TRICK
FF9D : ;**
FF9D : ;* EXAMINE & DEPOSIT
FF9D : ;**
FF9D : 8D C3 CHANGE BSR BADDR ;BUILD ADDRESS
FF9F : 8D E1 BSR OUTS ;PRINT SPACE
FFA1 : A6 00 LDA A, 0, X ;BYTE INTO A
FFA3 : 8D C8 BSR OUT2H ;PRINT BYTE
FFA5 : 8D DB BSR OUTS ;PRINT SPACE
FFA7 : 8D AA BSR BYTE ;GET NEW BYTE
FFA9 : E7 00 STA B, 0, X ;STORE NEW BYTE
FFAB : ;**
FFAB : ;* COMMAND DECODING SECTION
FFAB : ;**
FFAB : 9E F6 CRLF LDS SAVSTK
FFAD : C6 0D LDA B, #$0D ;CARRIAGE RETURN
FFAF : 8D D0 BSR OUTCH
FFB1 : C6 0A LDA B, #$0A ;LINE FEED
FFB3 : 8D CC BSR OUTCH
FFB5 : C6 2E LDA B, #'.' ;PROMPT CHARACTER
FFB7 : 8D C8 BSR OUTCH
FFB9 : BD FF 00 JSR INCH ;READ CHARACTER
FFBC : 17 TBA ;MAKE A COPY
FFBD : 8D C3 BSR OUTS ;PRINT SPACE
FFBF : 81 4C CMP A, #'L'
FFC1 : 27 8C BEQ LLOAD ;LOAD PAPER TAPE
FFC3 : 81 4A CMP A, #'J'
FFC5 : 26 04 BNE NOTJ
FFC7 : 8D 99 BSR BADDR ;GET ADDRESS TO JUMP TO
FFC9 : 6E 00 JMP 0, X ;JUMP TO IT
FFCB : 81 4D NOTJ CMP A, #'M'
FFCD : 27 CE BEQ CHANGE ;EXAMINE & DEPOSIT
FFCF : 81 4E CMP A, #'N'
FFD1 : 27 BC BEQ NCHANG ;E & D NEXT
FFD3 : 81 50 CMP A, #'P'
FFD5 : 26 D4 BNE CRLF
FFD7 : 3B RTI ;PROCEDE FROM BREAKPOINT
FFD8 : ;**
FFD8 : ;* RESET ENTRY POINT
FFD8 : ;**
FFD8 : 8E 00 F3 RESET LDS #ECHO ;INITIALIZE STACK POINTER
FFDB : C6 03 LDA B, #$03 ;INIT ECHO AND BRKADR FLAGS
FFDD : 37 PSH B
FFDE : 37 PSH B
FFDF : F7 F0 00 STA B, ACIACS ;MASTER RESET ACIA
FFE2 : F6 F0 02 LDA B, STRAPS ;LOOK AT STRAPS
FFE5 : 2B 19 BMI NOTERM ;NO TERM - JUMP TO 0
FFE7 : C4 04 AND B, #$04 ;GET # OF STOP BITS
FFE9 : CA D1 ORA B, #$D1
FFEB : F7 F0 00 STA B, ACIACS ;INIT ACIA PORT
FFEE : ;**
FFEE : ;* SOFTWARE INTERRUPT ENTRY POINT
FFEE : ;**
FFEE : 9F F6 INTRPT STS SAVSTK ;SAVE STACK POINTER
FFF0 : 9F FA STS XHI ;SAVE SP FOR N COMMAND
FFF2 : D6 F2 LDA B, BRKADR ;IF BIT 7 OF BRKADR IS SET
FFF4 : 2B 0A BMI NOTERM ;JUMP TO 0
FFF6 : 20 B3 BRA CRLF ;GOTO COMMAND DECODER
FFF8 : ;**
FFF8 : ;* NOW COME THE INTERRUPT VECTORS
FFF8 : ;**
FFF8 : ORG $FFF8
FFF8 : 01 00 FDB MIVEC ;MI VECTOR
FFFA : FF EE FDB INTRPT ;SWI VECTOR
FFFC : 01 04 FDB NMIVEC ;NMI VECTOR
FFFE : FF D8 FDB RESET ;RESET VECTOR
10000 :
10000 : END

symbol table (* = unused):
------------------------

ACIACS : F000 - | ACIADA : F001 - |
*ARCHITECTURE : i386-unknown-win32 - | BADDR : FF62 C |
*BIGENDIAN : 0 - | *BRANCHEXT : 0 - |
BRKADR : F2 C | *BUFFER : FF C |
*BUFULL : F5 C | BYTE : FF53 C |
BYTECT : F9 C | C1 : FF51 C |
*CASESENSITIVE : 0 - | CHANGE : FF9D C |
*CONSTPI : 3.141592653589793 - | CRLF : FFAB C |
*DATE : 1/29/2008 - | ECHO : F3 C |
*EXTFLG : F4 C | *FALSE : 0 - |
*FULLPMMU : 1 - | *HAS64 : 1 - |
*HASDSP : 0 - | *HASFPU : 0 - |
*HASPMMU : 0 - | IN1HG : FF23 C |
INCH : FF00 C | *INEXTMODE : 0 - |
INHEX : FF0F C | *INLWORDMODE : 0 - |
*INMAXMODE : 0 - | *INSRCMODE : 0 - |
*INSUPMODE : 0 - | INTRPT : FFEE C |
*LISTON : 1 - | LLOAD : FF4F C |
LOAD : FF29 C | LOAD11 : FF42 C |
LOAD15 : FF4E C | *MACEXP : 1 - |
MIVEC : 100 - | *MOMCPU : 6800 - |
*MOMCPUNAME : 6800 - | NCHANG : FF8F C |
*NESTMAX : 100 - | NMIVEC : 104 - |
NOTERM : 0 - | NOTJ : FFCB C |
OUT2H : FF6D C | OUTC1 : FF85 C |
OUTCH : FF81 C | OUTHR : FF75 C |
OUTS : FF82 C | *PACKING : 0 - |
*PADDING : 0 - | POLCAT : FF24 C |
*RELAXED : 1 - | RESET : FFD8 C |
*SAVEX : FD C | SAVSTK : F6 C |
*SHIFT : FC C | *STACK : F1 C |
STRAPS : F002 - | TEMP : F8 C |
*TIME : 23:17:26 - | *TRUE : 1 - |
*VERSION : 142F - | XHI : FA C |
XLOW : FB C |

69 symbols
34 unused symbols

AS V1.42 Beta [Bld 55] - source file flash_mon.asm - page 7 - 1/29/2008 23:17:26


codepages:
----------

STANDARD (0 changed characters)


0.03 seconds assembly time

242 lines source file
2 passes
0 errors
0 warnings