home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / DNTPAPER / DNT_04.MSA / ARCHIVES.DNT / SOURCES.ZIP / MONOEMUL / MONO_EMU.S < prev   
Text File  |  1992-12-11  |  11KB  |  257 lines

  1.     OUTPUT    mono_emu.prg
  2. ; The Auto Mono Emulator. V5.00 By Mick West.  November 20th 1988.
  3.  
  4. ; Routine to make the ST think it is in mono mode. Needs TOS in ROM
  5. ; Makes the system think that there is a mono screen, but actually
  6. ; be updating a medium real screen from this under Vblank interrupt
  7. ; The XBIOS calls; Physbase,Setscreen and Getrez are revectored.
  8. ; Put in an Auto Folder
  9. ; Works with any TOS in the entire world - hopefully
  10.  
  11.  
  12.  MOVE.L 4(A7),A0
  13.  MOVE.L #$8400,D6               ; 32K for the screen
  14.  ADD.L $C(A0),D6                ; plus the usual space
  15.  ADD.L $14(A0),D6
  16.  ADD.L $1C(A0),D6
  17.  MOVE.L D6,-(SP)                ; save length of program for later
  18.  
  19.  MOVE.W #4,-(SP)
  20.  TRAP #14                       ; Get screen Resolution
  21.  ADDQ.L #2,SP
  22.  CMP.W #2,D0                    ; If not high then carry on
  23.  BNE NOTHIGH        
  24.  MOVE.L (SP)+,D6                ; else tidy up the stack
  25.  MOVE.W #0,-(SP)                ; return ok to,GEM
  26.  TRAP #1                        ; Then exit back to desktop
  27. NOTHIGH:
  28.  CLR.L -(SP)
  29.  MOVE.W #32,-(SP)
  30.  TRAP #1                        ; Enter supervisor mode
  31.  ADDQ.L #6,SP
  32.  MOVE.L D0,SAVESTACK            ; Save the supervisor stack
  33.  
  34.  MOVE.L #MESSAGE,-(SP)          ; Address of start of message
  35.  MOVE.W #9,-(SP)                ; Print startup message
  36.  TRAP #1
  37.  ADDQ.L #6,SP
  38. INLOOP:
  39.  MOVE.L #INPUT,-(SP)
  40.  MOVE.W #9,-(SP)                ; Print input message
  41.  TRAP #1
  42.  ADDQ.L #6,SP
  43.  MOVE.B #3,MESSAGE              ; Input length = 3
  44.  MOVE.L #MESSAGE,-(SP)
  45.  MOVE.W #10,-(SP)
  46.  TRAP #1                        ; Input number
  47.  ADDQ.L #6,SP
  48.  MOVE.W #40,D0                  ; Default = 40
  49.  TST.B MESSAGE+1
  50.  BEQ DEFAULT                    ; If len=0
  51.  CMP.B #1,MESSAGE+1             ; len of 1 not allowed
  52.  BEQ INLOOP
  53.  CLR.W D0
  54.  MOVE.B MESSAGE+2,D0            ; first digit
  55.  SUB.W #48,D0
  56.  BLE INLOOP                     ; Too low
  57.  CMP.W #9,D0
  58.  BGT INLOOP                     ; Too High (>100)
  59.  MULU #10,D0
  60.  CLR.W D1
  61.  MOVE.B MESSAGE+3,D1            ; second digit
  62.  SUB.W #48,D1
  63.  BLT INLOOP                     ; Too low
  64.  CMP.W #9,D1
  65.  BGT INLOOP                     ; Too high
  66.  ADD.W D1,D0
  67.  CMP.W #80,D0
  68.  BGT INLOOP                     ; Check less than 80
  69. DEFAULT:
  70.  MOVE.W D0,SCANPOKE+2
  71.  SUB.L A5,A5
  72.  MOVE.L  $044E(A5),MED          ; Set MED
  73.  MOVE.L $B8,XBIOSPOKE+2         ; Get the old XBIOS address and
  74.  MOVE.L $70,VBLANKPOKE+2        ; VBLANK and insert into new versions
  75.  MOVE.L #0,MONOPOS              ; Set offset to top of screen
  76. SCANPOKE:
  77.  MOVE.W #40,MONOLINES           ; Fourty lines per Vblank is default
  78.  MOVE.W #0,MONOCOUNT            ; Counter is set to zero
  79.  LEA XEND,A2                    ; A2 = pos of generated code
  80.  LEA GEN,A1                     ; A1 = pos of instructions to copy
  81.  MOVE.W #39,D0                  ; Generate the code
  82. GENMOVE1:
  83.  MOVE.L (A1),(A2)+              ; Copys 40 of - MOVE.W (A0)+,(A1)+
  84.  DBF D0,GENMOVE1                ; and           MOVE.W (A2)+,(A1)+
  85.  ADDQ.L #4,A1
  86.  MOVE.W (A1),(A2)+              ; Move the RTS
  87.  MOVE.L A2,D0                   ; A2 = start of free memory
  88.  ADD.L #512,D0                  ; Force it to a 512 byte boundry
  89.  AND.L #$FFFFFE00,D0
  90.  MOVE.L D0,$044E(A5)            ; And that is the monochrome screen
  91.  MOVE.L D0,MONO                 ; Set MONO
  92.  MOVE.W #$0002,-(SP)            ; Hardware and Software to Mono
  93.  MOVE.L #-1,-(SP)
  94.  MOVE.L #-1,-(SP)
  95.  MOVE.W #5,-(SP)
  96.  TRAP #14                       ; Set high resolution
  97.  ADD.L #12,SP
  98.  MOVE.L    $70,A0            ; Save the old VBLANK
  99.  MOVE.L    #SIMPLE_VBLANK,$70    ; And set up mine
  100.  MOVE.W    #1,RASTER_FLAG        ; Set raster flag to 'not occured yet'
  101. WAIT_RASTER
  102.  TST.W    RASTER_FLAG        ; If still not occured
  103.  BNE    WAIT_RASTER        ; then loop until a vbl does occur
  104.  MOVE.B    #1,$FF8260        ; Back to medium hardware after VBL 
  105.  MOVE.L    A0,$70
  106.  MOVE.L #XBIOS,$B8              ; Set up the new XBIOS vector
  107.  MOVE.L #VBLANK,$70             ; And the new VBLANK vector
  108.  MOVE.L SAVESTACK,-(SP)         ; Restore the Supervisor stack
  109.  MOVE.W #32,-(SP)               ; And go back to User mode
  110.  TRAP #1
  111.  ADDQ.L #6,SP
  112.  MOVE.L (SP)+,D0                ; Tidy stack
  113.  CLR.W -(SP)                    ; Exit ok for GEM
  114.  MOVE.L D0,-(SP)                ; Length of program + data space
  115.  MOVE.W #$31,-(SP)              ; terminate and stay resident (TSR)
  116.  TRAP #1                        ; Finished this AUTO program
  117.  
  118. ; This is the new XBIOS routine
  119. XBIOS:                          
  120.  MOVEM.L A1/A2,-(SP)            ; Save A1 and A2
  121.  MOVE.L SP,A2                   ; A2 = the stack
  122.  ADD.L #8,A2                    ; offset over A1 and A2
  123.  BTST #5,(A2)                   ; Test if called from user mode
  124.  BNE NOTUSER                    ; Skip if it is
  125.  MOVE.L USP,A2                  ; Otherwise get A2 = User stack
  126.  SUB.L #6,A2                    ; Offset it as if it were the SSP
  127. NOTUSER:
  128.  MOVE.W $6(A2),D0               ; Get XBIOS instruction code
  129.  CMP.W #2,D0                    ; If it is _PHYSBASE 
  130.  BEQ PHYSBASE                   ; then jump to new PHYSBASE routine
  131.  CMP.W #4,D0                    ; If it is _GETREZ 
  132.  BEQ GETREZ                     ; then jump to new GETREZ routine
  133.  CMP.W #5,D0                    ; If it is NOT _SETSCREEN
  134.  BNE NORM_XBIOS                 ; Then continue with the normal XBIOS
  135.  MOVE.W #-1,16(A2)              ; Else alter rez.W to -1 (No change)
  136.  MOVE.L 12(A2),D0               ; Get the ploc.L parameter
  137.  CMP.L #-1,D0                   ; If it is -1 
  138.  BEQ NORM_XBIOS                 ; then continue with normal XBIOS
  139.  MOVE.L D0,MONO                 ; Otherwise, new value goes to MONO
  140.  MOVE.L #-1,12(A2)              ; Set ploc.L to -1 (no change)
  141.  BRA NORM_XBIOS                 ; then norm BIOS deals with lloc.L
  142. PHYSBASE:
  143.  MOVE.L MONO,D0                 ; Get address of mono screen
  144.  MOVEM.L (SP)+,A1/A2            ; Tidy stack
  145.  RTE                            ; Return mono screen location
  146. GETREZ:
  147.  MOVE.W #2,D0                   ; Pretend we are in mono resolution
  148.  MOVEM.L (SP)+,A1/A2            ; Tidy the stack
  149.  RTE                            ; Return code for mono resolution
  150. NORM_XBIOS:
  151.  MOVEM.L (SP)+,A1/A2            ; Tidy the stack up
  152. XBIOSPOKE:
  153.  JMP $0.L                       ; And jump into the normal XBIOS
  154.  
  155. ; This is the new VBLANK routine
  156. VBLANK: 
  157.  MOVEM.L D0-D7/A0-A6,-(SP)      ; Save all registers
  158.  MOVE.W #$333,$FF8242           ; Set up colours, grey for thin lines
  159.  MOVE.W #$333,$FF8244           ; (1 vert mono pixel = 1 grey med pix)
  160.  BTST #0,$FF8240                ; Check inverted
  161.  BEQ INVERT                     ; Jump if so
  162.  MOVE.W #$777,$FF8240           ; White background (normal)
  163.  MOVE.W #$000,$FF8246           ; Black ink
  164.  BRA NOINVERT
  165. INVERT:
  166.  MOVE.W #$000,$FF8240           ; Black background (inverted)
  167.  MOVE.W #$777,$FF8246           ; White ink
  168. NOINVERT:
  169.  CLR.L D0                 
  170.  MOVE.B $FF8201,D0              ; Video base high
  171.  LSL.L #8,D0                    ; times 256
  172.  MOVE.B $FF8203,D0              ; Plus video base low
  173.  LSL.L #8,D0                    ; All times 256
  174.  MOVE.L D0,A3                   ; Is the address of the Real screen
  175.  MOVE.L MONO,A0                 ; A0 = virtual mono screen
  176.  MOVE.L MED,A1                  ; A1 = real medium screen
  177.  CMP.L A1,A3                    ; Check if the real screen has moved
  178.  BEQ MEDOK                      ; Skip this if not
  179.  MOVE.L A3,A0                   ; Get the new real screen address
  180.  MOVE.L A0,MONO                 ; Set MONO From this
  181.  MOVE.L A1,D0                   ; And put the real screen back 
  182.  LSR.L #8,D0                    ; to its origional position
  183.  MOVE.B D0,$FF8203         
  184.  LSR.L #8,D0
  185.  MOVE.B D0,$FF8201
  186. MEDOK:
  187.  MOVE.L A0,A2                   ; A2 = mono start
  188.  ADD.L #80,A2                   ; plus 80, on to next line
  189.  MOVE.L MONOPOS,D2              ; Get position in the screen RAM
  190.  ADD.L D2,A0                    ; Offset position in mono screen
  191.  ADD.L D2,A2                    ; And the other mono position
  192.  ADD.L D2,A1                    ; Offset pos in real medium screen
  193.  MOVE.W #20,D1                  ; default 20 lines / Vblank
  194.  TST.B $43E                     ; Test flock system variable
  195.  BNE COPYMOVE                   ; Set speed to 20 if using disk drive
  196.  MOVE.W MONOLINES,D1            ; Otherwise get preset speed
  197. COPYMOVE:
  198.  BSR XEND                       ; combine and move two mono lines
  199.  ADD.L #80,A0                   ; both need moving down another line
  200.  ADD.L #80,A2                   ; in the mono screen
  201.  ADD.L #160,MONOPOS             ; move down one medium/two mono lines
  202.  ADD.W #1,MONOCOUNT             ; count medium lines dome
  203.  CMP.W #200,MONOCOUNT           ; Done 200 medium/ 400 mono ?
  204.  BNE NOT200                     ; if not then skip
  205.  MOVE.L #0,MONOPOS              ; otherwise reset ram offset
  206.  SUB.L #32000,A0                ; MONO position back to top of screen
  207.  SUB.L #32000,A1                ; and the same for MEDIUM
  208.  SUB.L #32000,A2                ; and the other MONO position
  209.  MOVE.W #0,MONOCOUNT            ; reset the counter
  210. NOT200:
  211.  DBF D1,COPYMOVE                ; loop round MONOLINES times
  212. VBLEXIT:
  213.  MOVEM.L (SP)+,D0-D7/A0-A6      ; Restore all registers
  214. VBLANKPOKE:
  215.  JMP $0.L                       ; Jump to normal VBLANK routine
  216.  
  217. ; This is a simple Vblank routine that just clears a flag 
  218. SIMPLE_VBLANK
  219.  CLR.W RASTER_FLAG        ; Indicate a Vertical blank has occured
  220.  RTE
  221.  
  222. ; The following bits of code are not called but are used to calculate
  223. ; a large chunk of code to combine two mono lines into one medium one.
  224. GEN:                            
  225.  MOVE.W (A0)+,(A1)+              ; Move one Mono line to one Medium
  226.  MOVE.W (A2)+,(A1)+              ; line on both colour planes times 40
  227.  
  228.  RTS
  229.  
  230.  EVEN
  231. SAVESTACK: DC.L 0
  232. MONO:      DC.L 0               ; Base address of mono screen
  233. MED:       DC.L 0               ; Base address of medium screen
  234. MONOPOS:   DC.L 0               ; Offset in both screens in bytes
  235. MONOLINES: DC.L 0               ; Pairs of mono lines to do per VBLANK 
  236. MONOCOUNT: DC.L 0               ; Count of pairs done so far
  237. RASTER_FLAG:  DC.W    0    ; Flag cleared every raster (tempory)
  238.  
  239. XEND: nop                       ; Position of calculated code 
  240.  
  241. MESSAGE:
  242.  DC.B 27,'E','The Mono Emulator - Mick West 1988',13,10
  243.  DC.B 'V5.00. Should be in AUTO Folder',13,10
  244.  DC.B 'Will run with any TOS',13,10,13,10
  245.  DC.B 'This is Shareware',13,10
  246.  DC.B 'Send Money and Problems to:',13,10
  247.  DC.B 'Mick West',13,10
  248.  DC.B '27 Lynton Drive,',13,10
  249.  DC.B 'Shipley,',13,10
  250.  DC.B 'BD18 3DJ',13,10
  251.  DC.B 'ENGLAND',13,10,13,10
  252.  DC.B 'Feel free to give away copies of this',13,10
  253.  DC.B 'But please copy the whole folder',13,10,13,10,0
  254. INPUT:
  255.  DC.B 13,10
  256.  DC.B 'Enter speed (10 to 80, Return = 40) ',0
  257.