PROGRAM LISTING: 87-06/INFORMER.M65
0100 ; THE INFORMER - SOURCE CODE
0110 ; BY MATT LOVELESS & MIKE EGGERS
0120 ; (c)1987, ANTIC PUBLISHING, INC.
0130 .TITLE "INFORMER II -- Internal status line"
0140 *= $0600
0150 ;
0160 SETVBV = $E45C ;Sets VBL vector
0170 XITVBV = $E462 ;VBLANK exit rtn
0180 SDLST = $0230 ;Vector to D/L
0190 CONSOL = $D01F ;Console buttons
0200 ROWCUR = $54 ;Cursor row
0210 COLCUR = $55 ;Cursor column
0220 SHFLOK = $02BE ;CAPS/LWR status
0230 INVFLG = $02B6 ;Inv. video flag
0240 MEMLO = $90 ;BASIC low mem.
0250 HIMEM = $02E5 ;System high mem
0260 CASINI = $02 ;Cassette boot
0270 ; init. vector
0280 BOOTF = $09 ;Boot flag
0290 .PAGE "Setup system vectors"
0300 ;==========================
0310 ; Put INFORMER online.
0320 ;==========================
0321 STARTCODE
0330 SETUP
0340 LDA #SETUP&255 ;high byte of 0311 ; init. addr.
0350 STA CASINI
0360 LDA #SETUP/256 ;low byte of
0370 ; init. addr.
0380 STA CASINI+1
0390 LDA BOOTF ;Cassette boot?
0400 ORA #$02
0410 STA BOOTF
0420 LDA #$04 ;Check [OPTION]
0430 BIT CONSOL
0440 BNE ON
0450 ;
0460 RTS ;If [OPTION]then
0470 ; don't set VBI's
0480 ;
0490 ON
0500 LDX #DOLINE/256 ;Hi VBL vctr
0510 LDY #DOLINE&255 ;Low byte
0520 LDA #7 ;Use def. vector
0530 JMP SETVBV ;Set VBLANK vctr
0540 ;
0550 ; (The RTS instruction
0560 ; of SETVBV will return
0570 ; control.)
0580 ;
0590 .PAGE "Build a new INFORMER line"
0600 ;
0610 DOLINE
0620 LDA SDLST+1 ;If Hi byte of
0630 ; DLIST vector
0640 CMP #DSPLST/256
0650 ; is the same as
0660 ; hi byte of mine
0670 BEQ MAKELN ;then DLIST is
0680 ; still setup.
0690 ;
0700 ;Setup new DISPLAY-LIST header
0710 LDA SDLST ;Set DLIST JuMP
0720 CLC ;to jump to
0730 ; ;current-DLIST+3
0740 ADC #3 ;to avoid
0750 ; BLANK-8-LINES
0760 STA JMPADR ;instructions.
0770 LDA SDLST+1
0780 ADC #0
0790 STA JMPADR+1
0800 LDA #DSPLST&255 ;Reset DLIST
0810 STA SDLST ; vector to
0820 LDA #DSPLST/256 ;point to
0830 STA SDLST+1 ; my header.
0840 ;
0850 ; Create the informer line
0860 ;
0870 MAKELN
0880 LDA ROWCUR ;Print cur. row
0890 LDY #RSPOT-MESSAGE
0900 ; (position in status line.)
0910 JSR CONVRT
0920 ;
0930 LDA COLCUR ;Print column
0940 LDY #CSPOT-MESSAGE
0950 JSR CONVRT
0960 ;
0970 ;Find the CAPS/LOWER
0980 ;and INVERSE modes.
0990 LDA SHFLOK ;Get CAPS/LOWR
1000 ; status, convert
1010 CLC ;into an index
1020 ROL A ;between 0 and 2
1030 ROL A
1040 ROL A
1050 TAX
1060 LDA SHFTBL,X ;Get visual
1070 ; representation
1080 ORA INVFLG ;Check INVERSE
1090 EOR #$80 ;Toggle inverse
1100 ; if necessary.
1110 STA LSPOT
1120 ; Put free RAM on screen
1130 SEC
1140 LDA HIMEM ;subtract MEMLO
1150 ; from HIMEM
1160 SBC MEMLO
1170 TAY ;save it in Y
1180 LDA HIMEM+1
1190 SBC MEMLO+1
1200 LDX #$00
1210 LOOP
1220 PHA ;save for later
1230 LSR A ;SHIFT HIGH
1240 ; NIBBLE DOWN
1250 LSR A
1260 LSR A
1270 LSR A
1280 JSR CB2AH ;Convert binary
1290 ; to ATASCII hex
1300 STA FRESPOT,X ;& display it
1310 INX
1320 PLA
1330 AND #$0F ;mask hi nibble
1340 JSR CB2AH
1350 ;
1360 STA FRESPOT,X
1370 INX
1380 CPX #$04
1390 BEQ RETURN
1400 ;
1410 TYA
1420 ;
1430 JMP LOOP
1440 RETURN
1450 JMP XITVBV ;go home
1460 ;
1470 .PAGE "Convert binary to printable hex"
1480 ;===============================
1490 ; CONVERT BINARY TO HEX
1500 ; (Mike made me do it)
1510 ;===============================
1520 CB2AH
1530 CMP #$0A ;Digit 0 thru 9?
1540 BCC NUMBER ;YES!!!
1550 ;
1560 CLC
1570 ADC #$97 ;Make it A-F
1580 RTS
1590 ;
1600 NUMBER
1610 ORA #$90 ;Make it 0-9
1620 RTS
1630 JMP RETURN ;UNCONDITIONAL!
1640 ;
1650 .PAGE "Convert binary to printable"
1660 CONVRT
1670 LDX #4 ;Max 4x10 values
1680 LOOP2
1690 CMP MAXTBL,X ; <= to value?
1700 BCS FOUND ;Yes
1710 ;
1720 DEX ;No, next check
1730 BNE LOOP2
1740 ;
1750 FOUND
1760 SEC
1770 SBC MAXTBL,X ;Pull off tens
1780 ORA #$90 ;Make digit
1790 ; printable
1800 STA MESSAGE+1,Y
1810 LDA CHRTBL,X ;Print tens
1820 ; digit
1830 STA MESSAGE,Y
1840 RTS
1850 .PAGE "Tables and message line"
1860 ;==========================
1870 ; DATA AREAS AND TABLES
1880 ;==========================
1890 DSPLST
1900 ; Prints INFORMER line
1910 .BYTE $70,$60,$10,$42
1920 .WORD MESSAGE
1930 .BYTE $01 ;Goto to old DL
1940 JMPADR
1950 .WORD 0
1960 ;
1970 SHFTBL
1980 .BYTE $61,$21,$40 ;"A","a","