; ORG $2000 ;LOW LEVEL DISK ACCESS ;SECTOR READER ;WRITTEN BY THOMAS EVERETT ;FEB 17-19, 1989 ;APR 2, 1989 ;STARTED REVISION 2 ;APRIL 26, 1989 ;CONTINUED WORK ;JULY 18, 1989 ;NOV 3, 1989 ;APRIL 1,1990 ;IT WILL RETURN TO BASIC ;PRESSING ESC. FROM ;THE EDITOR PUTS YOU ;IN THE ROUTINE TO SELECT ;TRK., SEC. ESC. WILL THEN ;EXIT THE PROGRAM ; ;ALL ROUTINES MUST EXIT ;WITH SLOT IN X ; ; ZERO PAGE VARIABLES ; ; NEXT 2, GENERAL PURPOSE ; SCRATCH VARIABLES ST1 EQU $06 ST2 EQU $07 ST3 EQU $08 ST4 EQU $09 PT1L EQU $19 PT1H EQU $1A ; NEXT TWO VARIABLES ; ARE SCRATCH FOR READ RDSC1 EQU $1B RDSC2 EQU $1C SLOT1 EQU $1D ; FOLLOWING VARIABLES ; (USES APPLESOFT'S SPACE) ; ARE SECTORING BYTES ; ; ADDRESS FEILD AP1 EQU $60 AP2 EQU $61 AP3 EQU $62 AE1 EQU $63 AE2 EQU $64 AE3 EQU $65 ; DATA FEILD DP1 EQU $66 DP2 EQU $67 DP3 EQU $68 DE1 EQU $69 DE2 EQU $6A DE3 EQU $6B ; ; $300 PAGE VAIABLES ; TRK EQU $300 UTRK EQU $301 DTRK EQU $302 SLOT EQU $303 DSEC EQU $304 USEC EQU $305 SECB1 EQU $306 SECB2 EQU $307 CX EQU $308 CY EQU $309 POS EQU $30A NOBYTS EQU $30B VOL EQU $30C ; TOPBUFL EQU $320 TOPBUFH EQU $321 BOTBUFL EQU $322 BOTBUFH EQU $323 WRTRLOC EQU $324 RDTRLOC EQU $325 BUF1LOC EQU $326 BUF2LOC EQU $327 BUF3LOC EQU $328 BUF4LOC EQU $329 ; BSTR EQU $330 ; ; MONITOR VARIABLES ; KEYBD EQU $C000 STROBE EQU $C010 SPKR EQU $C030 PAGE2 EQU $C055 DISSEM EQU $FE5E NORMAL EQU $FE84 INVERSE EQU $FE80 SAVEREG EQU $FF4A GETREG EQU $FF3F PRTAX EQU $F941 DELAY EQU $FCA8 PRSPC EQU $F948;3 SPACES ;PRBL2 IS PART OF PRSPC PRBL2 EQU $F94A HOME EQU $FC55 VTAB EQU $FC22 CROUT EQU $FD8E COUT EQU $FDED KEYIN EQU $FD0C DIGOUT EQU $FDE3 MONITOR EQU $FF69 PRHEX EQU $FDDA BASIC EQU $3D0 ; ; BUFFERS ; WBUFFD EQU $3029 ; WRITE TRANSLATE TABLE ; POINTER IS WRTRLOC ; SOURCE IS WRTRANS ; RBUFFD EQU $3100 ; READ TRANSLATE TABLE ; POINTER IS RDTRLOC ; SOURCE IS RDTRANS ; BUFF1 EQU $3200 ; PRIMARY BUFFER ; POINTER IS BUF1LOC ; BUFF2 EQU $3300 ; SECONDARY BUFFER ; POINTER IS BUF2LOC ; BUFF3 EQU $3400 ; SECTORIZED BUFFER ; POINTER IS BUF3LOC ; BUFF4 EQU $3500 ; TRACK READ/WRITE BUFFER ; POINTER IS BUF4LOC ; RUNS FROM $3500->$5500 ; ; ; ; START ; START JSR HOME JSR SETUP JMP COMMNDIN DRVON LDA $C08C,X; Q6 OFF LDA $C08E,X; Q7 OFF LDA $C08B,X; DRV 2 LDA $C089,X; ON RTS MARM LDA DTRK ASL;MULT *2 STA DTRK MARM1 LDY TRK CPY DTRK BEQ MARM3 BPL MARM2 INC TRK INC TRK MARM2 DEC TRK LDA TRK AND #$03 ASL ORA SLOT TAX LDA $C081,X LDA #$56 JSR DELAY LDA $C080,X JMP MARM1 MARM3 LDX SLOT STY TRK RTS ; WRITEPROTECTED WRITPRO JMP MONITOR ; WRITE WRITE JSR FINDSEC WRA LDA $C08C,X BPL WRA STA $340 ; ; INIT9 SEC LDX SLOT STX SLOT1 ; CHECK FOR WRITE PROTECT LDA $C08D,X LDA $C08E,X BMI WRITPRO ; GET FIRST BYTE 2NDARY BUFFER LDA BUFF2 STA ST1 ; DO FIRST WRITE LDA #$FF STA $C08F,X ORA $C08C,X ; WASTE TIME PHA PLA NOP LDY #$04 WR1 PHA;3 PLA;4 JSR WRTIME;6+22 DEY;2 BNE WR1;2 ; WRITE FIRST BYTES LDA DP1 JSR WRB1 LDA DP2 JSR WRB1 LDA DP3 JSR WRB1 ; WRITE 2NDAY BUFFER TYA LDY #$56 BNE WR2 WR3 LDA BUFF2,Y;5 WR2 EOR BUFF2-1,Y;4 TAX;2 LDA WBUFFD,X;5 LDX SLOT1;2 STA $C08D,X;5 LDA $C08C,X;5 DEY;2 BNE WR3;2 LDA ST1 NOP ; WRITE 1ST BUFFER WR4 EOR BUFF1,Y TAX LDA WBUFFD,X LDX SLOT STA $C08D,X LDA $C08C,X LDA BUFF1,Y INY BNE WR4 ; CHECKSUM TAX LDA WBUFFD,X LDX SLOT1 JSR WRITBT2 ; WRITE ENDING BYTES LDA DE1 JSR WRB1 LDA DE2 JSR WRB1 LDA DE3 JSR WRB1 LDA #$FF JSR WRITBT ; PUT IN READ MODE LDA $C08E,X LDA $C08C,X RTS WRITBT CLC WRB1 NOP;2 NOP;2 NOP;2 NOP;2 STA $C08D,X;5 LDA $C08C,X;5 RTS WRTIME PHA;3 PLA;4 WRITBT2 STA $C08D,X;5 ORA $C08C,X;4 RTS;6 FINDSEC NOP ; PUT IN READ MODE LDA $C08E,X LDA $C08C,X ; FIND #$D5 (ADDRESS) R1 LDA $C08C,X BPL R1 R1.1 STA BSTR EOR #$D5 BNE R1 ; FIND #$AA (ADDRESS) R2 LDA $C08C,X BPL R2 STA BSTR+1 EOR #$AA BNE R1 ;FIND #$96 (ADDRESS) R3 LDA $C08C,X BPL R3 STA BSTR+2 EOR #$96 BNE R1 ;SKIP VOLUME BYTE ONE R4 LDA $C08C,X BPL R4 STA BSTR+3 ;SKIP VOLUME BYTE TWO R4.1 LDA $C08C,X BPL R4.1 STA BSTR+4 ;SKIP TRACK BYTE ONE R4.2 LDA $C08C,X BPL R4.2 STA BSTR+5 ;SKIP TRACK BYTE TWO R4.3 LDA $C08C,X BPL R4.3 STA BSTR+6 ; CHECK OUT SECTOR BYTE ONE R8 LDA $C08C,X BPL R8 CMP SECB1 BNE R1 ; CHECK OUT SECTOR BYTE TWO R8.1 LDA $C08C,X BPL R8.1 CMP SECB2 BRANCH BNE R1 ; SKIP CHECKSUM BYTE ONE R9 LDA $C08C,X BPL R9 STA BSTR+7 ; SKIP CHECKSUM BYTE TWO R9.1 LDA $C08C,X BPL R9.1 STA BSTR+8 ; SKIP EPILOGUE BYTES (3) R10 LDA $C08C,X BPL R10 STA BSTR+9 R10.1 LDA $C08C,X BPL R10.1 STA BSTR+10 RTS R10.2 LDA $C08C,X BPL R10.2 STA BSTR+11 RTS READ NOP JSR FINDSEC ; LOOK FOR DATA'S #$D5 R5 LDA $C08C,X BPL R5 EOR #$D5 BNE R5 ; LOOK FOR DATA'S #$AA R6 LDA $C08C,X BPL R6 EOR #$AA BNE BRANCH ; LOOK FOR DATA'S #$AD LDY #$56 R7 LDA $C08C,X BPL R7 CMP #$AD BNE BRANCH ; LOAD SECONDARY BUFFER LDA #$00 RN1 DEY RN1.2 STY RDSC1 RN1.1 LDY $C08C,X BPL RN1.1 EOR RBUFFD,Y LDY RDSC1 STA BUFF2 ,Y BNE RN1 ; FILL PRIMARY BUFFER RN2 STY RDSC1 RN2.1 LDY $C08C,X BPL RN2.1 EOR RBUFFD,Y LDY RDSC1 STA BUFF1,Y INY BNE RN2 ;STORE VALUE OF ACC STA BSTR+16 ; GET DISK CHECKSUM BYTE RN3 LDY $C08C,X BPL RN3 STY BSTR+14 ; TURN OFF DRIVE LDA $C088,X ; GET CALCULATED CHECKSUM BYTE LDY BSTR+14 LDA RBUFFD,Y STA BSTR+15 ; CHECK IF SAME LDA BSTR+16 CMP BSTR+15 BNE EXITERR EXITCL LDA #$80 STA BSTR+17 JMP EXITRD EXITERR LDA #$FF STA BSTR+17 JMP MONITOR ; EXIT READ EXITRD LDX SLOT RTS POSTNIB NOP LDA #$00 STA ST1 LDA BUF3LOC STA ST2 LDY #$00 POSTNIB1 LDX #$56 POSTNIB2 DEX BMI POSTNIB1 LDA BUFF1,Y LSR BUFF2,X ROL LSR BUFF2,X ROL STA (ST1),Y INY CPY #$00 BNE POSTNIB2 LDX SLOT RTS PRENIB NOP LDA #$00 STA ST1 LDA BUF3LOC STA ST2 LDX #$00 LDY #$02 PRENIB1 DEY LDA (ST1),Y LSR ROL BUFF2 ,X LSR ROL BUFF2,X STA BUFF1,Y INX CPX #$56 BCC PRENIB1 LDX #$00 TYA BNE PRENIB1 LDX #$55 PRENIB2 LDA BUFF2,X AND #$3F STA BUFF2,X DEX BPL PRENIB2 LDX SLOT RTS ; ; READ A TRACK ; RDTRK NOP ; SETUP JSR TRKRW ; READ MODE LDA $C08E,X LDA $C08C,X ; FIND SOME #$FF'S ; SO THAT IN SYNC RDTRK2 LDY #$05 RDTRK3 LDA $C08C,X BPL RDTRK3 CMP #$FF BNE RDTRK2 DEY BNE RDTRK3 ; READ INFORMATION RDTRK1 LDA $C08C,X BPL RDTRK1 STA (ST1),Y ; INC POINTERS INY BNE RDTRK1 ; NEXT PAGE INC ST2 LDA ST2 CMP ST3 BNE RDTRK1 ; EXIT LDA $C088,X RTS ; ; INITIALIZE A TRACK ; ; WRITE PROTECTED INIT8 JMP MONITOR INIT1 RTS INIT NOP ; DO SETUP ; ; VOL = 256 LDA #$FF STA VOL ; $3E = #$AA LDA #$AA STA $3E ; ; PUT VOL IN ZERO PAGE LDA VOL STA ST3 ; PUT UTRK IN ZERO PAGE LDA UTRK STA ST4 ; ; GET TRACK JSR INFOIN2 ; BLANK BUFF1 + BUFF2 JSR BNKBF1 JSR BNKBF2 ; TURN ON DRIVE LDX SLOT JSR DRVON ; GOTO TRACK LDA UTRK STA DTRK JSR MARM ; START SECTOR $0F LDA #$10 STA ST2 ; START WITH 256 SYNCS LDY #$FF INIT5 DEC ST2 JSR INITER ; WRITE DATA LDX SLOT STX SLOT1 JSR INIT9 ; DO 16 SYNCS NEXT TRACKS LDY #$0F ; CONTINUE TRACK LOOP LDA ST2 CMP #$00 BNE INIT5 JMP INIT6 INITER NOP ; CHECK FOR WRITE PROTECT LDA $C08D,X LDA $C08E,X BMI INIT8 ; DO FIRST WRITE ; THIS PUTS IN WRITE MODE SEC LDA #$FF LDX SLOT STA $C08F,X CMP $C08C,X ; WASTE TIME PHA PLA ; WRITE AUTOSYNCS INIT2 PHA;3 PLA;4 JSR INIT10;6+22 DEY;2 BNE INIT2;2 ; WRITE SECTOR HEADER LDA AP1 JSR INIT11 LDA AP2 JSR INIT11 LDA AP3 JSR INIT11 ; DISK VOL 256 LDA ST3 JSR INIT4 LDA ST4 JSR INIT4 LDA ST2 JSR INIT4 LDA ST3 EOR ST4 EOR ST1 PHA LSR ORA $3E STA $C08D,X LDA $C08C,X PLA ORA #$AA JSR INIT7 LDA AE1 JSR INIT11 LDA AE2 JSR INIT11 LDA AE3 JSR INIT11 RTS ; EXIT INIT6 NOP ; PUT IN READ MODE LDA $C08E,X LDA $C08C,X ; TURN OFF DRIVE LDA $C088,X RTS INIT4 PHA LSR ORA $3E;ORA #$AA STA $C08D,X CMP $C08C,X PLA NOP NOP NOP ORA #$AA INIT7 NOP;2 INIT3 NOP;2 INIT10 PHA;3 PLA;4 STA $C08D,X;5 CMP $C08C,X;4 RTS;6 INIT11 NOP;2 NOP;2 NOP;2 NOP;2 STA $C08D,X;5 LDA $C08C,X;5 RTS ; ; BLANK BUFF1 ; BNKBF1 NOP LDA BUF1LOC STA ST2 LDA #$00 STA ST1 LDY #$00 BNKBF1.2 STA (ST1),Y INY BNE BNKBF1.2 RTS ; ; BLANK BUFF2 ; BNKBF2 NOP LDA BUF2LOC STA ST2 LDA #$00 STA ST1 LDY #$00 BNKBF2.2 STA (ST1),Y INY BNE BNKBF2.2 RTS ; CODE COMMON TO TRACK READ ; AND TRACK WRITE TRKRW NOP ; GET TRACK JSR INFOIN2 ; TURN ON DRIVE LDX SLOT JSR DRVON ; GOTO TRACK LDA UTRK STA DTRK JSR MARM ; CALC ENDING PAGE ; NOBYTS = PAGES NEEDED LDA BUF4LOC CLC ADC NOBYTS STA ST3 ; SETUP POINTERS LDA #$00 STA ST1 LDA BUF4LOC STA ST2 LDY #$00 RTS SETUP LDX #$60 STX SLOT ; SETUP SECTOR BYTES LDA #$D5 STA AP1 LDA #$AA STA AP2 LDA #$96 STA AP3 LDA #$DE STA AE1 LDA #$AA STA AE2 LDA #$EB STA AE3 LDA #$D5 STA DP1 LDA #$AA STA DP2 LDA #$AD STA DP3 LDA #$DE STA DE1 LDA #$AA STA DE2 LDA #$EB STA DE3 ; SETUP NUMBER OF PAGES ; FOR TRACK READ/WRITE LDA #$20 STA NOBYTS ; SET BUFFER LOCATIONS LDA #$30 STA WRTRLOC LDA #$31 STA RDTRLOC LDA #$32 STA BUF1LOC LDA #$33 STA BUF2LOC LDA #$34 STA BUF3LOC LDA #$35 STA BUF4LOC ; SET RESET VECTOR TO START ;LDA #START ;STA $3F2 ;LDA #START/ ;STA $3F3 ;JSR $FB6F ; SETUP READ TRANSLATE TABLE LDA #$00 STA ST1 LDA RDTRLOC STA ST2 LDY #$96 LDX #$00 SET1 LDA RDTRANS,X STA (ST1),Y INX INY BNE SET1 ; SETUP WRITE TRANSLATE TABLE LDA #$00 STA ST1 LDA WRTRLOC STA ST2 LDY #$29 LDX #$00 SET2 LDA WRTRANS,X STA (ST1),Y INX INY CPY #$69 BNE SET2 ; RECALIBRATE THE DRIVE LDX SLOT LDA #$00 STA DTRK LDA #$50 STA TRK JSR DRVON JSR MARM1 LDA $C088,X RTS GTSECN NOP LDA DSEC ASL;MULT *2 TAY INY LDA SECDAT,Y STA SECB1 INY LDA SECDAT,Y STA SECB2 RTS ;CTPHY TURNS THE LOGICAL SECTOR ;NUMBER IN DSEC TO PHYSICAL CTPHY NOP LDY USEC INY LDA SECEQU,Y STA DSEC RTS ;READ TRANSLATE TABLE ;FOUND AT $BA96-> $BAFF IN DOS 3.3 RDTRANS DFC $00,$01,$98 DFC $99,$02,$03,$9C,$04,$05,$06 DFC $A0,$A1,$A2,$A3,$A4,$A5 DFC $07,$08,$A8 DFC $A9,$AA,$09,$0A,$0B,$0C,$0D DFC $B0,$B1,$0E,$0F,$10,$11,$12 DFC $13,$B8,$14,$15,$16,$17,$18 DFC $19,$1A,$C0,$C1,$C2,$C3,$C4 DFC $C5,$C6,$C7,$C8,$C9,$CA,$1B DFC $CC,$1C,$1D,$1E,$D0,$D1,$D2 DFC $1F,$D4,$D5,$20,$21,$D8,$22 DFC $23,$24,$25,$26,$27,$28,$E0 DFC $E1,$E2,$E3,$E4,$29,$2A,$2B DFC $E8,$2C,$2D,$2E,$2F,$30,$31 DFC $32,$F0,$F1,$33,$34,$35,$36 DFC $37,$38,$F8,$39,$3A,$3B,$3C DFC $3D,$3E,$3F ; WRITE TRANSLATE TABLE ; FOUND AT $BA29 -> $BA68 IN DOS WRTRANS DFC $96,$97 DFC $9A, $9B DFC $9D, $9E,$9F DFC $A6,$A7 DFC $AB, $AC,$AD,$AE DFC $AF,$B2,$B3 DFC $B4,$B5 DFC $B6,$B7 DFC $B9,$BA,$BB DFC $BC,$BD,$BE DFC $BF,$CB DFC $CD,$CE,$CF DFC $D3,$D6,$D7 DFC $D9,$DA,$DB DFC $DC,$DD,$DE,$DF DFC $E5,$E6,$E7 DFC $E9,$EA,$EB,$EC DFC $ED,$EE,$EF DFC $F2,$F3,$F4,$F5,$F6,$F7 DFC $F9,$FA,$FB,$FC,$FD,$FE,$FF ;DATA TABLE OF LOGICAL SECTOR #'S SECEQU NOP DFC $00,$0D,$0B,$09,$07,$05,$03,$01,$0E,$0C,$0A,$08,$06,$04,$02,$0F ;DATA TABLE OF SECTOR NUMBER BYTES SECDAT NOP D0 DFC $AA,$AA D1 DFC $AA,$AB D2 DFC $AB,$AA D3 DFC $AB,$AB D4 DFC $AA,$AE D5 DFC $AA,$AF D6 DFC $AB,$AE D7 DFC $AB,$AF D8 DFC $AE,$AA D9 DFC $AE,$AB DA DFC $AF,$AA DB DFC $AF,$AB DC DFC $AE,$AE DD DFC $AE,$AF DE DFC $AF,$AE DF DFC $AF,$AF WORDS1 ASC "TRACK " WORDS2 ASC "SECTOR " WORDS3 ASC "COMMAND " HEXIN JSR KEYIN CMP #$9B BEQ EXIT CMP #$88 BEQ HEXIN JSR CONV STA ST1 JSR DIGOUT LDA ST1 ASL ASL ASL ASL STA ST1 HEXIN1 JSR KEYIN CMP #$9B BEQ EXIT CMP #$88 BEQ HEXIN1 JSR CONV STA ST2 JSR DIGOUT LDA ST2 ORA ST1 STA ST1 RTS CONV CMP #$C0 BPL C1 SBC #$AF JMP C2 C1 SBC #$B7 C2 RTS EXIT JMP $3D0 INFOIN2 NOP LDX #$00 LDY #$15 JSR TAB JMP PR3 INFOIN NOP LDX #$00 LDY #$14 JSR TAB LDY #$00 PR2 LDA WORDS2,Y JSR COUT INY CPY #$07 BNE PR2 JSR HEXIN STA USEC JSR CROUT PR3 LDY #$00 PR1 LDA WORDS1,Y JSR COUT INY CPY #$06 BNE PR1 JSR HEXIN STA UTRK RTS ; ; SCREEN EDITOR FOR DISK PROGRAM ; STARTED FEB 20, 1989 ; BY THOMAS EVERETT ;PT1 POINTS TO POSITION IN BUFFER ;TOPBUF AND BOTBUF POINT TO ;START AND END OF BUFFER ; ; START ; COMMNDIN JSR SHOW256 COMMND JSR SHOWPOS LDX CX LDY CY JSR TAB JSR KEYIN JSR BEEP ; INTERPERT INPUT COMMND1 NOP CMP #$C9 BEQ CUPJ CMP #$8B BEQ CUPJ CMP #$CD BEQ CDOWNJ CMP #$8A BEQ CDOWNJ CMP #$88 BEQ CLEFJ CMP #$95 BEQ CRJ CMP #$8D BEQ RETJ CMP #$9B BEQ ESCJ CMP #$D2 BEQ READCOMJ CMP #$D7 BEQ WRITCOMJ CMP #$B1 BEQ SHOW256J CMP #$B2 BEQ SHOWPRMJ CMP #$B3 BEQ SHOW2NDJ CMP #$B4 BEQ SHOW4J CMP #$CE BEQ PRENJ CMP #$C4 BEQ POSTNJ CMP #$DA BEQ RDTRKJ CMP #$D8 BEQ INITJ CMP #$AC;, BEQ CONSTDNJ CMP #$AE BEQ CONSTUPJ;. CMP #$CC BEQ LISTJ JMP COMMND ;JUMP TABLE CUPJ JSR CUP JMP COMMND CDOWNJ JSR CDOWN JMP COMMND CLEFJ JMP CLEF CRJ JMP CR RETJ JMP RET ESCJ JMP ESC READCOMJ JMP READCOM WRITCOMJ JMP WRITCOM SHOW256J JSR SHOW256 JMP COMMND SHOWPRMJ JSR SHOWPRM JMP COMMND SHOW2NDJ JSR SHOW2ND JMP COMMND SHOW4J JSR SHOW4 JMP COMMND PRENJ JSR PRENIB JMP COMMND POSTNJ JSR POSTNIB JMP COMMND RDTRKJ JSR RDTRK JMP COMMND INITJ JSR INIT JMP COMMND CONSTDNJ JSR CONSTDN JMP COMMND CONSTUPJ JSR CONSTUP JMP COMMND LISTJ JSR LIST JMP COMMND CUP NOP ; AT TOP OF BUFFER? LDA PT1H CMP TOPBUFH BNE CUP1 LDA PT1L CMP TOPBUFL BNE CUP1 ; YES ; CURSOR AT TOP OF SCREEN? LDY CY CPY #$02 BNE CUP2 ; YES ; DO NOTHING RTS ; MOVE UP CURSR CUP2 LDY CY DEY STY CY LDA POS SEC SBC #$08 STA POS RTS CUP1 NOP ; CURSOR AT BOTTOM OF BUFFER? LDY #$05 CPY CY BCC CUP2 ; MOVE UP PAGE JSR UP RTS CDOWN NOP ; AT BOTTOM OF BUFFER? LDA PT1H CMP BOTBUFH BNE CDOWN1 LDA PT1L CMP BOTBUFL BNE CDOWN1 ; YES ; CURSOR AT BOTTOM OF SCREEN? LDY CY CPY #$08 BNE CDOWN2 ; YES ; DO NOTHING RTS ; MOVE DOWN CURSOR CDOWN2 LDY CY INY STY CY LDA POS CLC ADC #$08 STA POS RTS CDOWN1 NOP ; AT TOP OF SCREEN LDY CY CPY #$05 BCC CDOWN2 ; NO ; MOVE PAGE DOWN JSR DOWN RTS CLEF NOP ; GET X POSITION LDA CX ; AT LEFT EGDE? BEQ CLEF1 ; NO SUBTRACT #$04 FROM X SEC SBC #$03 STA CX ; DEC POS DEC POS CLEF1 JMP COMMND CR NOP ; GET X POSITION LDA CX ; AT RIGHT EDGE? CMP #$15 ; YES, EXIT BEQ CR1 ; NO ADD #$04 TO X CLC ADC #$03 STA CX ; INC POS INC POS CR1 JMP COMMND RET LDX #$0D LDY #$14 JSR TAB JSR HEXIN LDY POS STA (PT1L),Y JSR PRNT JMP COMMND ESC JMP MONITOR READCOM JSR INFOIN LDX SLOT JSR DRVON;DRV ON LDA UTRK STA DTRK JSR MARM;DO ARM JSR CTPHY;L TO P JSR GTSECN; BYTES JSR READ JSR POSTNIB LDX SLOT LDA $C088,X JSR SHOW256 JMP COMMND WRITCOM JSR INFOIN LDX SLOT JSR DRVON LDA UTRK STA DTRK JSR MARM JSR CTPHY JSR GTSECN JSR PRENIB JSR WRITE LDA $C088,X JMP COMMND CONSTDN NOP CONST1 LDA KEYBD BPL CONST2 BIT STROBE RTS CONST2 JSR CDOWN JSR SHOWPOS JMP CONST1 CONSTUP NOP CONST3 LDA KEYBD BPL CONST4 BIT STROBE RTS CONST4 JSR CUP JSR SHOWPOS JMP CONST3 LIST NOP LDA $3B STA ST2 LDA $3A STA ST1 ; POSITION ON SCREEN LDX #$00 LDY #$09 JSR TAB ; CALCULATE PRESENT POSITION LDA PT1L CLC ADC POS BCS LIST2 TAX LDA PT1H LIST3 STA $3B STX $3A JSR LISTER LDA ST2 STA $3B LDA ST1 STA $3A RTS LIST2 TAX LDY PT1H INY TYA JMP LIST3 LISTER TSX STX ST1 JSR $FE75 LDA #$05 LISTER2 PHA JSR $F8D0 JSR $F953 STA $3A STY $3B PLA SEC SBC #$01 BNE LISTER2 LDX ST1 TXS RTS SHOW256 LDX BUF3LOC JMP SETPNTS SHOWPRM LDX BUF1LOC JMP SETPNTS SHOW2ND LDX BUF2LOC JMP SETPNTS SHOW4 LDA BUF4LOC STA PT1H STA TOPBUFH CLC ADC NOBYTS STA BOTBUFH LDA #$00 STA BOTBUFL STA TOPBUFL JMP SETPNTS1 SETPNTS NOP ; SET POINTER HIGH STX PT1H ; SET BUFFER BOUNDRIES STX TOPBUFH INX STX BOTBUFH LDX #$00 STX TOPBUFL STX BOTBUFL ; CURSOR POSITON SETPNTS1 LDX #$18 STX POS ; CURSOR X POSITION LDA #$00 STA CX ; CURSOR Y POSITION LDA #$05 STA CY ; POINTER LOW LDA #$00 STA PT1L RTS ; MOVE PAGE UP UP LDA PT1L BEQ UP1 SEC SBC #$08 STA PT1L RTS UP1 SEC SBC #$08 STA PT1L DEC PT1H RTS ; MOVE PAGE DOWN DOWN LDA PT1L CMP #$F8 BEQ DOWN1 CLC ADC #$08 STA PT1L RTS DOWN1 CLC ADC #$08 STA PT1L INC PT1H RTS SETINV PHA TYA PHA JSR INVERSE PLA TAY PLA RTS SETNORM PHA TYA PHA JSR NORMAL PLA TAY PLA RTS TAB NOP STX $24 STY $25 JSR VTAB RTS BEEP LDY #$50 BEEP2 BIT SPKR DEY BNE BEEP2 RTS SHOWPOS LDX #$00 LDY #$13 JSR TAB LDA PT1H LDX PT1L JSR PRTAX LDX #$01 JSR PRBL2 LDA POS JSR PRHEX LDX #$01 JSR PRBL2 ; DISPLAY ACTUAL POSITION IN BUFF LDA PT1L CLC ADC POS BCS SHOWPOS2 TAX LDA PT1H SHOWPOS3 JSR PRTAX JSR PRNT RTS SHOWPOS2 TAX LDY PT1H INY TYA JMP SHOWPOS3 PRNT NOP LDA #$01 STA ST2 LDY #$00 JMP PRNT4 PRNT1 LDX #$08 PRNT2 NOP LDA (PT1L),Y STA ST4 JSR SAVEREG JSR PRNUM JSR PRCHR JSR GETREG ; DONE #$38 CHARS? INY CPY #$38 BEQ PRNT3 DEX BNE PRNT2 ; DONE #$08 ACROSS, RESET REGS PRNT4 LDA #$00 STA ST1 LDA #$19 STA ST3 INC ST2 JMP PRNT1 PRNT3 RTS PRNUM NOP ; POSITION ON SCREEN LDX ST1 LDY ST2 JSR TAB ; HIGHLIGHT #$FF LDA ST4 CMP #$FF BNE PRNUM1 JSR SETINV PRNUM1 JSR PRHEX JSR SETNORM INC ST1 INC ST1 INC ST1 RTS PRCHR NOP ; POSITION ON SCREEN LDX ST3 LDY ST2 JSR TAB ; GET CHAR LDA ST4 ; PRINT JSR COUT INC ST3 RTS